2

編集: 手動で追加されたビルダーと同じ構成を持つ外部ビルダーをプラグインに追加させる方法を理解できませんでした。私は、プロジェクト ファイルを直接変更するという Bananeweizen の提案を使用するのは十分に維持できないと判断しました。私たちは今のところあきらめています。ユーザーに手動で外部ビルダーを作成してもらいます。

私は、同僚の 1 人が開発した優れたコマンド ライン ツールの GUI として機能する Eclipse プラグインを作成しています。開発者はプラグインを使用して、特定の構成でコマンド ライン ツールを実行する bash スクリプトを作成します。bash スクリプトが作成されると、外部ツール ビルダーとして Eclipse プロジェクトに手動で追加できます (下の画像を参照)。そのステップを自動化することは、私が問題を抱えているところです

**bash スクリプトは手動で追加できますが、プログラムでは追加できません**

まず、bash スクリプトを外部ビルダーとして追加するコード:

createBuilderConfigFile();

IProjectDescription desc = project.getDescription();
ICommand newCommand = desc.newCommand();
newCommand.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.FULL_BUILD, true);
newCommand.setBuilderName("org.eclipse.ui.externaltools.ExternalToolBuilder");
Map<String, String> arguments = new HashMap<String, String>();
arguments.put("LaunchConfigHandle", "<project>/.externalToolBuilders/CodeGen.launch");
newCommand.setArguments(arguments);
List<ICommand> allCommands = new ArrayList<ICommand>();
allCommands.add(newCommand);
for (ICommand command : desc.getBuildSpec()) {
    allCommands.add(command);
}
ICommand[] commandArray = allCommands.toArray(new ICommand[allCommands.size()]);
desc.setBuildSpec(commandArray);
project.setDescription(desc, null);

最初の行は、CodeGen.launch. これは SO postに似ています。次に、コードの残りの部分は、.project次のようなコードで Eclipse プロジェクトのファイルを更新します。

<buildCommand>
  <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
  <arguments>
     <dictionary>
        <key>LaunchConfigHandle</key>
        <value>&lt;project&gt;/.externalToolBuilders/CodeGen.launch</value>
     </dictionary>
  </arguments>
</buildCommand>

それはほぼ完璧に機能します。プロジェクトがビルドされると、スクリプトが実行されます。ただし、スクリプトはソース ファイルを更新するため、Eclipse のメイン メニューから[プロジェクト] -> [自動的にビルド] を選択すると、プロジェクトが再度ビルドされます。再構築によりスクリプトが再度実行され、ユーザーが自動構築をオフにするまでサイクルが続きます。

ビルダーのリストを開くと、プラグインが作成したビルダーが表示されます (上の画像を参照)。[編集... ] をクリックし、何も変更せず、[ OK ] をクリックすると、新しいビルダーは自動ビルドではなく、手動ビルドに対してのみ実行されます。現在.project、ファイルは異なります。ビルダー定義を手動で開いて保存すると、Eclipse がそれを更新しました。次のようになります。

<buildCommand>
  <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
  <triggers>full,incremental,</triggers>
  <arguments>
     <dictionary>
        <key>LaunchConfigHandle</key>
        <value>&lt;project&gt;/.externalToolBuilders/CodeGen.launch</value>
     </dictionary>
     <dictionary>
        <key>incclean</key>
        <value>true</value>
     </dictionary>
  </arguments>
</buildCommand>

<triggers>新しいタグと新しい<dictionary>値に注意してください。私のコードを見ると、スクリプトを実行するビルドを指定しようとしている行がわかります。これらの行は無視されます。それらをコメントアウトしても、結果の.projectファイルは同じです。これはおそらく、「org.eclipse.ui.externaltools.ExternalToolBuilder」が構成できないビルダーであることが原因です。が falseを返すことを確認しました。ここnewCommand.isConfigurable()のドキュメントでは、false を返すビルダーが を無視することを示唆しています。「org.eclipse.ui.externaltools.ExternalToolBuilder」以外の拡張ポイントを検索しましたが、構成用に開いていますが、まだ見つかりません。isConfigurable()setBuilding()

ビルダーを手動で定義するユーザーと同じ結果でプラグインが外部ビルダーを定義する方法はありますか?

4

1 に答える 1

1

他のすべてが失敗した場合でも、ファイルの読み取り/書き込みによって .project ファイルをスキャンして更新できます。その後、変更したプロジェクトを呼び出しiProject.refreshLocal(DEPTH_INFINITE, ...)て、Eclipse に変更を認識させます。

于 2013-04-02T06:08:16.647 に答える