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

Iva*_*van 11 java eclipse osgi eclipse-rcp tycho

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

Repo1 -> P2 repo 1
Repo2 -> P2 repo 2
Repo3 -> P2 repo 3
Run Code Online (Sandbox Code Playgroud)

此外,每个存储库都有一个目标定义文件,其中包含来自第三方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
Run Code Online (Sandbox Code Playgroud)

现在我有以下问题.构建第一个存储库后,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>
Run Code Online (Sandbox Code Playgroud)

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

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

等等....

我现在想使用git子模块来集成这3个repos以避免p2存储库或在一个存储库中移动所有存储库.

Jon*_*ham 11

将版本设置为 0.0.0

我不知道如何使用目标编辑器编辑.target文件来实现此目的,但您可以通过在XML或文本编辑器中编辑来输入目标文件中的版本号,如下所示:0.0.0

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

而不是使用目标编辑器进行编辑,而是使用优秀的"目标平台定义DSL和生成器".它允许您更明智地编辑目标文件.在上面的例子中,您可以使用lazyversion关键字指定您想要0.0.0的版本号.它看起来像这样:

location "http://my/repo/path" my_repo {
    com.example.feature.group lazy
}
Run Code Online (Sandbox Code Playgroud)

两全其美

可以在命令行调用生成器(例如,从pom.xml),这应该允许您在.tpd文件中保留版本号.如果.tpd文件中没有版本号,则生成的.target文件将具有已解析的版本号到最新版本.如果将生成的.target文件保留为构建工件的一部分,则可以根据正确的依赖关系重建软件的旧版本.