【问题标题】:Maven release and versions maven pluginMaven 发布和版本 Maven 插件
【发布时间】:2013-01-16 12:53:11
【问题描述】:

在进行快照/发布时,依赖项的编号/版本控制策略是什么?

一个由 15 名开发人员组成的团队,20 个 Maven 父项目 = 总共 70 多个 POM,包括子模块 POM。目前有很多依赖项,这 70 个中的大多数依赖于其中一个。

过去:

所有 POMS 都有 1.0.0-SNAPSHOT 作为它们的版本,并且在依赖项标签下。它通过 mvn deploy 上传到 Nexus 存储库。

现在:

我们最近开始做mvn release。所以所有 20 个父 POM 现在都是 1.0.1-SNAPSHOT 并发布版本 1.0.0 因为它们都位于 Nexus 中。所有 <dependencies> 标签现在都指向 1.0.0

问题:

开发人员不想指出发布版本。他们需要来自同行的前沿开发版本1.0.X-SNAPSHOT,无论它是否不稳定。

SCM 只想指向RELEASE 版本,因为他必须每周执行一次mvn release,这将失败,因为它指向快照版本。

问题:

现在我知道了 version plugin ,但问题是,我应该在 POM 中放入什么,以便双方都通过运行自己的 mvn versions: 命令版本感到满意。 POM 最好指向 SNAPSHOTS,以便 15 人满意,当 SCM 发布时,他可以运行 mvn versions:something,然后所有内容都转换为 RELEASE 版本,而不是 SNAPSHOTS。然后返回给开发者的 SNAPSHOTS。

【问题讨论】:

  • 这是一个单一的大爆炸版本,还是所有单独的模块都独立发布? IOW SCM 运行了多少项目mvn release:prepare release:perform 以减少发布
  • 20个项目一一发布。每个都有 2-15 个模块,如 projA-parent、projA-jar、projA-war、projA-Ear .. 所以发布插件修改的 POM 总数将是 100+,但我可以做 20 次迭代的解决方案,如果有一个..

标签: maven maven-3 nexus maven-release-plugin versions-maven-plugin


【解决方案1】:

我将其作为答案,尽管目前这还不是很有效的答案。

当我在 Maven 发布插件中添加 completionGoals 配置选项时,我的目标是启用开发使用版本范围的工作流程,但该发布将仅固定到具体版本。

添加到版本 Maven 插件的启用目标之一是 versions:resolve-ranges 目标。缺少的是一种在之后再次取消解析这些范围的方法。

在我们再次需要它之前,我们真的没有任何安全的地方来存储发布插件不会反对或清理的原始范围。

我想到的最接近的解决方案是在包含版本范围的版本旁边注入XML PI...在这种情况下,pom.xml 将被转换为,例如

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>com.foo.bar</groupId>
      <artifactId>manchu</artifactId>
      <version>[1.2.3,2.0)</version>
    </dependency?
    ...
  </dependencies>
  ...
</project>

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>com.foo.bar</groupId>
      <artifactId>manchu</artifactId>
      <version>1.5.7</version>
      <?versions-maven-plugin allowed-version-range="[1.2.3,2.0)"?>
    </dependency?
    ...
  </dependencies>
  ...
</project>

通过确保 preparationGoals 包含 versions:resolve-ranges 目标...(注意:版本插件可能必须派生第三个 Maven 以解决缺少 pom.xml 重新加载的问题,以便拥有 clean verify是有意义的,虽然resolve-ranges 应该在构建正在使用的确切版本中解决,所以它不应该成为问题)。

然后在completionGoals 中,您有(尚未实现的)versions-maven-plugin 目标,该目标删除 XML PI 并将范围放回原处。

目前有许多问题阻止了这一点:

  • 不确定 Maven 发布插件的 pom 重写是否会删除 XML PI(需要测试确认)

  • versions-maven-plugin 中的 XML 解析库充其量是 hacky,需要更好的解决方案来启用 XML PI 注入

  • 我儿子需要关注,我很少有时间来处理这些问题。

不过,你们也许可以拼凑一些东西。

  1. completionGoals 设置为versions:use-next-snapshots versions:commit 之类的东西

  2. 像这样运行你的版本mvn versions:use-releases versions:commit scm:commit release:prepare release:perform install

那么应该发生什么:

  • 我们将-SNAPSHOTs 切换到版本

  • 我们将更改提交给 SCM

  • 我们开始准备发布

  • 1234563 -SNAPSHOT 已经在本地存储库中,因此它们会为我们自动升级自动(在理论中))我们依靠release:prepare 为我们提交更改.
  • 正常释放

  • 我们将下一个开发 -SNAPSHOT 安装到本地 repo 中,以便所有下游项目在运行 versions:use-next-snapshots 时都会更新其版本

以上内容容易出错...如果我可以为您提供基于版本范围的解决方案,我会更喜欢,但是,现在这是我能看到的最好的解决方案。

【讨论】:

  • 有趣.. 让我考虑一下,尽管我有点惊讶于没有现成的方法。我认为这对于“Maven 人”来说是一个很常见的难题
  • 请记住,大多数人不喜欢developing on top of sand,所以您遇到的问题是您的开发人员喜欢在沙子上构建,因此理所当然地将快照依赖项保留在主干中。
  • 我知道最好不要这样做。但仅此而已 - 最佳实践。现在,如果我的 RELEASE 在 3 周内发生一次,并且在这期间开发人员需要最新的“base-utility-project”,它是一切的“基础”,他们将无法承受 3 周后的惊喜!我想把它称为类似于“代码合并”的地方,你越早拥有其他人的代码,作为拇指规则就越好。这是我的库 JAR 的一种合并,仅此而已。我必须以某种方式管理它。
  • 嗯,你的问题似乎暗示生活在沙滩上是开发过程的一个永久部分。这种情况下的最佳实践是:减少上游依赖的常规里程碑;或者将上游依赖重构为 API 和 IMPL。 API 应该在 sprint 之间保持稳定,并且新版本的 IMPL 应该只修复错误或引入新功能,因此您不需要最新版本。使用 CI 系统(例如 Jenkins)在 SCM 中的当前代码上运行构建,以及与最新前沿流沙依赖项的集成构建。
  • 你可以让 Jenkins 每晚都删减你所有东西的里程碑版本,并自动推进版本。或者,如果它们是那个紧密耦合的,也许它们应该在同一个多模块构建中,然后在发布多模块项目时,Maven 发布插件会自动更新 -SNAPSHOT 依赖项作为一个。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2018-01-31
  • 2011-06-18
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多