繁体   English   中英

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

[英]Developing an Eclipse plugin that can add an External Builder to a project

编辑:我无法弄清楚如何使我的插件添加具有与手动添加的生成器相同配置的外部生成器。 我认为使用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 然后,其余代码使用如下代码更新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-> 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文件也不.project 这可能是由于“ org.eclipse.ui.externaltools.ExternalToolBuilder”是一个不可配置的构建器。 我已经确认newCommand.isConfigurable()返回false,并且这里的文档建议对于isConfigurable()返回false的构建器将忽略setBuilding() 我搜索的扩展点不是“ org.eclipse.ui.externaltools.ExternalToolBuilder”,该扩展点可以进行配置,但是我还没有找到。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM