2

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

我正在编写一个 Eclipse 插件,作为我同事开发的一个优秀命令行工具的 GUI。开发人员使用该插件创建一个 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 主菜单中选择Project->Build Automatically,则会导致再次构建项目。重新构建会导致脚本再次运行,并且循环继续,直到用户关闭自动构建。

如果我打开构建器列表,我可以看到我的插件创建的构建器(见上图)。如果我单击Edit...不进行更改,然后单击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”是一个不可配置的构建器。我已经确认newCommand.isConfigurable()返回 false,并且此处的文档表明返回 false for 的构建器isConfigurable()将忽略setBuilding(). 我搜索了除“org.eclipse.ui.externaltools.ExternalToolBuilder”之外的扩展点,它是开放配置的,但我还没有找到。

我的插件有什么方法可以定义与手动定义构建器的用户具有相同结果的外部构建器?

4

1 回答 1

1

如果一切都失败了,您仍然可以通过文件读/写来扫描和更新 .project 文件。然后调用iProject.refreshLocal(DEPTH_INFINITE, ...)您修改的项目以使 Eclipse 了解更改。

于 2013-04-02T06:08:16.647 回答