1

我们有一个 PDE 构建,创建了一个大型 p2 存储库。我们在 PDE 构建期间跳过 p2 导向器,以在特定功能(已构建的子功能)上调用 p2.director。

问题是我们的一个插件有一个我们不想满足的可选依赖项,而所有其他可选依赖项都应该得到满足。这可能吗?

4

2 回答 2

3

如果您使用更新版本的 PDE 无头构建(或者可能还有任何其他构建工具),所有可选的清单依赖项都将转换为可选的、非贪婪的 p2 依赖项(即当 p2 解析安装计划时忽略的依赖项。 ) 这里的背景是,在 Juno M1 版本中,p2 发布者被更改为默认生成可选的、非贪婪的 p2 依赖项

如果您确实想要一个可选的、贪婪的 p2 依赖项,您可以通过 p2.inf 更改贪婪requires.<n>.greedy=true,或者在 MANIFEST.MF 中添加x-installation指令:

Import-Package: org.example;resolution:=optional;x-installation:=greedy

更一般地说,您应该避免可选的、贪婪的 p2 依赖项。原因是它们可能会在您的用户安装中导致令人惊讶的行为:如果最初不满足可选的贪婪依赖项,并且用户碰巧使用包含依赖项的 p2 存储库(例如,安装完全不相关的东西),则贪婪的依赖也将被添加到安装中。因此,对于可选的贪婪依赖项,在将 p2 存储库添加到可用软件站点列表后,安装可能会“随机”更改。

因此,您应该将所有依赖项保留为可选的、非贪婪的,而是提供两个包含您的插件的功能:一个具有可选依赖项,一个不具有可选依赖项。通过这种方式,您的用户可以完全控制他们是否想要安装可选的东西。

于 2013-08-20T15:25:34.133 回答
1

我终于设法告诉 p2 通过在插件的 META-INF/ 文件夹中创建一个 p2.inf 文件来避免仅在此插件中查找可选依赖​​项。

p2.inf 只是告诉可选的导入包是非贪婪的,这意味着它不会尝试解决这种依赖关系。

这是一个例子:

requires.0.namespace=java.package
requires.0.name=com.lowagie.text
requires.0.greedy=false
requires.0.optional=true
requires.1.namespace=java.package
requires.1.name=com.lowagie.text.exceptions
requires.1.greedy=false
requires.1.optional=true
于 2013-04-26T13:00:34.233 回答