开发可以将外部构建器添加到项目的Eclipse插件

时间:2013-04-01 21:01:36

标签: java eclipse eclipse-plugin

修改 我无法弄清楚如何使我的插件添加一个与手动添加的构建器具有相同配置的外部构建器。我决定使用Bananeweizen建议直接修改项目文件是不够可维护的。我们现在放弃了。我们将让用户手动创建外部构建器。

我正在编写一个Eclipse插件,作为我的一位同事开发的优秀命令行工具的GUI。开发人员使用该插件创建一个bash脚本,该脚本使用某些配置运行命令行工具。创建bash脚本后,可以将其作为外部工具生成器手动添加到Eclipse项目中(参见下图); 自动化该步骤是我遇到麻烦的地方

**I can add the bash script manually, but not programatically**

首先,将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的文件。它与this SO post类似。然后,其余代码使用如下所示的代码更新Eclipse项目中的.project文件:

<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主菜单中选择了 Project-&gt; Build Automatically ,则会导致再次构建项目。重新构建会导致脚本再次运行,并且循环将继续,直到用户关闭自动构建。

如果我打开构建器列表,我可以看到我的插件创建的构建器(参见上图)。如果我单击编辑... 不做任何更改,然后单击确定,则新构建器仅针对手动构建运行,而不是自动运行-builds。 .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”是一个不可配置的构建器。我已确认newCommand.isConfigurable()返回false,文档here表明对isConfigurable()返回false的构建器将忽略setBuilding()。我已经搜索了除“org.eclipse.ui.externaltools.ExternalToolBuilder”以外的扩展点,这个扩展点已经打开配置,但我还没有找到它。

我的插件是否有办法定义外部构建器,其结果与手动定义构建器的用户的结果相同?

1 个答案:

答案 0 :(得分:1)

如果所有其他方法都失败了,您仍然可以通过文件读/写来扫描和更新.project文件。然后在您修改的项目上调用iProject.refreshLocal(DEPTH_INFINITE, ...)以使Eclipse知道更改。