Eclipse plugin 如何将插件分组到功能中

Eclipse plugin 如何将插件分组到功能中,eclipse-plugin,osgi,Eclipse Plugin,Osgi,我们正在努力学习如何正确使用功能 假设我们有一个插件org.acme.module,它依赖于org.thirdparty.specific和org.acme.core 我们还有插件org.acme.other,它依赖于org.acme.core 我们希望从这些文件创建一个应用程序,其中包括一个目标文件和一个产品文件。我们有以下选择: 每个模块一项功能: org.acme.core.feature org.acme.core org.acme.module.feature org.acme

我们正在努力学习如何正确使用功能

假设我们有一个插件
org.acme.module
,它依赖于
org.thirdparty.specific
org.acme.core

我们还有插件
org.acme.other
,它依赖于
org.acme.core

我们希望从这些文件创建一个应用程序,其中包括一个目标文件和一个产品文件。我们有以下选择:

每个模块一项功能:

  • org.acme.core.feature
    • org.acme.core
  • org.acme.module.feature
    • org.acme.module
  • org.acme.other.feature
    • org.acme.other
  • org.thirdparty.specific.feature
    • org.thirdparty.specific
这使得目标和产品文件庞大,并且依赖关系很难手动管理

每个依赖项组一个功能:

  • org.acme.module.feature
    • org.acme.core
    • org.acme.module
    • org.thirdparty.specific
  • org.acme.other.feature
    • org.acme.core
    • org.acme.other
这种方法使得依赖关系非常容易管理,并且目标和产品文件易于读取和维护。然而,它根本不起作用。当
org.acme.core
改变时,您需要改变所有的特性。此外,应用程序在打包什么方面没有发言权,因此它甚至无法决定更新
org.acme.core
(因为有错误修复或其他原因)

平台功能:

  • org.acme.platform.feature
    • org.acme.core
    • org.acme.other
    • org.thirdparty.specific
      (但可能是它自己的功能)
  • org.acme.module.feature
    • org.acme.module
这是用于Hello World应用程序和Eclipse附加组件的方法,它只适用于这些应用程序。由于所有模块的目标平台都指向
org.acme.platform.feature
,因此每当任何平台插件发生任何更改时,您都必须相应地更新
org.acme.platform.feature

实际上,我们只用了大约50个平台插件就尝试了这种方法。让开发人员为每一个错误修复更改功能是不可行的。(虽然Tycho支持版本“0.0.0”,但Eclipse不支持,因此使用它是另一个问题。此外,我们需要可复制性,因此让PDE随意选择版本是不可能的。)

这一切再次归结为“在新功能发布前的两周内,我不能使用
org.acme.platform.feature
并覆盖
org.acme.core
的版本


整个问题变得更加困难,因为有时可能会有多个插件配置(比如针对不同的数据库提供程序),然后会有高级模块使用其他子模块来正确工作,这必须以某种方式进行管理

我们缺少什么吗?其他公司如何处理这些问题


Eclipse人员似乎使用“每个模块一个功能”的方法。这并不奇怪,因为这是唯一有效的方法。但他们不使用目标平台或产品文件。

成功分组的关键是何时在功能中使用“包含”,何时只使用依赖项。区别在于“包含”“是真正包含的,即p2将始终安装包含的捆绑包和/或包含的功能。这就是为什么您需要在每个功能中更新一个包(如果包括它)的原因。如果不进行更新,则在安装过程中会出现多个版本

此外,在过去,必须在功能中指定依赖项。现在,p2将主要从bundle中找出依赖项。因此,我实际上会停止在特性中指定依赖项,而只是包括。将特性视为一种指定聚合内容的方法

分组的另一个关键点是-少就是多。如果您有尽可能多的功能包,那么很可能会出现粒度问题。相反,请考虑用户将分别安装什么。对于用户永远不会单独安装的东西,不需要有四个特性。特性不应被理解为对开发/项目结构进行分组的一种方式——这是SCM或不同SCM repo中的文件夹可以使用的地方。将特性视为部署结构

使用这种方法,我建议使用类似于以下示例的结构

my.product.base

  • 包含产品最小值的基本特征
  • 可以是org.acme.core加上一些最小值
my.product.base.dependencies

  • my.product.base的第三方库功能
my.addon.xyz

  • 功能绑定附加组件
  • 可单独安装的独立功能
my.addon.xyz.dependencies

  • 用于附加依赖项的第三方库
现在在产品定义中,我只列出了我的.product.base。不需要同时列出依赖项功能。p2将自动获取并安装依赖项。但是,如果要将产品绑定到依赖项的特定版本,并且不希望p2选择任何匹配版本,则必须包含my.product.base.dependencies功能

在目标定义中,我将包含一个“my.product.sdk”特性。该特性是所有其他特性的聚合特性