【发布时间】:2013-04-08 22:29:01
【问题描述】:
我们有一个 PDE 构建,创建了一个大型 p2 存储库。我们在 PDE 构建期间跳过 p2 导向器,以在特定功能(已构建的子功能)上调用 p2.director。
问题是我们的一个插件有一个我们不想满足的可选依赖项,而所有其他可选依赖项都应该得到满足。这可能吗?
【问题讨论】:
我们有一个 PDE 构建,创建了一个大型 p2 存储库。我们在 PDE 构建期间跳过 p2 导向器,以在特定功能(已构建的子功能)上调用 p2.director。
问题是我们的一个插件有一个我们不想满足的可选依赖项,而所有其他可选依赖项都应该得到满足。这可能吗?
【问题讨论】:
如果您使用更新版本的 PDE 无头构建(或可能还有任何其他构建工具),所有可选的清单依赖项都将转换为可选的非贪婪 p2 依赖项(即依赖项当 p2 解析安装计划时会被忽略。)这里的背景是在 Juno M1 版本中,the p2 publishers were changed to generate optional, non-greedy p2 dependencies by default。
如果您确实想要一个可选的、贪婪的 p2 依赖项,您可以通过带有requires.<n>.greedy=true 的 p2.inf 更改贪婪,或者在 MANIFEST.MF 中添加 x-installation 指令:
Import-Package: org.example;resolution:=optional;x-installation:=greedy
一般来说,您应该避免可选的、贪婪的 p2 依赖项。原因是它们可能会在您的用户安装中导致令人惊讶的行为:如果最初不满足可选的贪婪依赖项,并且用户碰巧使用包含依赖项的 p2 存储库(例如,安装完全不相关的东西),则贪婪的依赖也将被添加到安装中。因此,对于可选的贪婪依赖项,在将 p2 存储库添加到可用软件站点列表后,安装可能会“随机”更改。
因此,您应该将所有依赖项保留为可选的、非贪婪的,而是提供两个包含您的插件的功能:一个包含可选依赖项,另一个不包含可选依赖项。这样,您的用户就可以完全控制他们是否要安装可选的东西。
【讨论】:
我终于设法通过在插件的 META-INF/ 文件夹中创建一个 p2.inf 文件来告诉 p2 避免仅在此插件中查找可选依赖项。
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
【讨论】: