如何避免 eclipse 目标定义中的特定功能版本

Posted

技术标签:

【中文标题】如何避免 eclipse 目标定义中的特定功能版本【英文标题】:How to avoid the specific feature versions in eclipse target definitions 【发布时间】:2016-02-12 07:04:51 【问题描述】:

我有一个 osgi 项目,它分为 3 个存储库。每个存储库都有自己的使用 Tycho 构建到 p2 存储库中:

Repo1 -> P2 repo 1
Repo2 -> P2 repo 2
Repo3 -> P2 repo 3

此外,每个存储库都有一个目标定义文件,其中包含来自第三方 p2 存储库和其他项目存储库(上述 P2 repo1、P2 repo 2 或 P2 repo 3)的捆绑包。 Repo2 包含对 Repo1 包的依赖项,Repo3 对 Repo1 和 Repo2 包有依赖项:

Repo1 Target Definition -> Eclipse Orbit P2
Repo2 Target Definition -> Eclipse Orbit P2, P2 repo1
Repo3 Target Definition -> Eclipse Orbit P2, P2 repo1, P2 repo2

现在我有以下问题。构建第一个存储库后,P2 repo1 存储库更新并包含具有新快照版本的功能。 Repo2 和 Repo3 的目标定义取决于 Repo1 包的先前快照版本,如果不更新适当的目标定义(在 Eclipse 中目标编辑器中有更新按钮),就不可能构建这些存储库。

<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<unit id="com.myproduct.feature.api.game.feature.group" version="1.0.0.201509251400"/>
<unit id="com.myproduct.feature.impl.game.feature.group" version="1.0.0.201509251400"/>
<repository location="http:............../target/repository/"/>
</location>

所以不可能自动构建所有 3 个 repos,所以构建过程变得过于复杂:

提交第一个 repo 中的更改并使用 Jenkins 构建它 更新 repo2 的目标定义,使其指向新版本的 repo 1 功能 在 repo2 中提交此更新并使用 Jenkins 构建它

等等……

我现在正在考虑使用 git 子模块来集成这 3 个存储库,以避免 p2 存储库或将所有存储库移动到一个存储库中。

【问题讨论】:

我最近遇到了同样的问题,并且一直手动更新目标平台,因为只有一个上游 p2 存储库不经常更改。您是否考虑过将目标平台更新为最新快照的预构建步骤(但不确定这是否真的可行)? 【参考方案1】:

将版本设置为0.0.0

我不知道如何用Target Editor编辑.target文件来实现这个,但是你可以在通过在 XML 或文本编辑器中编辑目标文件,如下所示:

<location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
  <unit id="com.example.feature.group" version="0.0.0"/>
  <repository id="my_repo" location="http://my/repo/path"/>
</location>

通过在目标文件中指定版本号0.0.0,您应该从 p2 存储库中获取最新版本的单元。

也就是说,使用这种 lazy(更多关于下面的名称)指定版本的方式存在严重的缺点。这使得返回和重建项目的旧版本变得非常困难,因为旧版本将从 p2 存储库中提取最新版本的依赖项,而不是正确的版本。

使用目标平台定义 DSL 和生成器

不要使用目标编辑器进行编辑,而是使用出色的"Target Platform Definition DSL and Generator"。它允许您更明智地编辑目标文件。在上述情况下,您可以使用lazy 版本关键字来指定您希望0.0.0 作为版本号。它看起来像这样:

location "http://my/repo/path" my_repo 
    com.example.feature.group lazy

两全其美

可以在command line 调用生成器(例如从 pom.xml),这应该允许您在 .tpd 文件中省略版本号。 .tpd 文件中没有版本号,生成的 .target 文件将具有最新版本的解析版本号。如果您将生成的 .target 文件保留为构建工件的一部分,您将能够针对正确的依赖项重新构建旧版本的软件。

【讨论】:

以上是关于如何避免 eclipse 目标定义中的特定功能版本的主要内容,如果未能解决你的问题,请参考以下文章

如何避免使用自动工具重新编译不同路径中的不同目标?

如何将自定义 WebPartPage 部署到特定目标站点 (Web)

如何在 Eclipse 下载站点上找出包含所需插件的功能

如何制作启动特定类的自定义Eclipse运行启动程序?

如何在Eclipse中选择特定版本的Java EE?

如何检查某个功能在特定 iOS 版本上是不是可用?