如何让 Maven 自动使用 git 状态作为版本号的一部分?



这个问题是更广泛的 在 Java 项目中自动递增内部版本号

具体来说,我希望 Maven 生成格式的版本major.minor.sequence其中major.minorpom.xml中硬编码,但sequence号是从命令的输出中获得的git rev-list HEAD --count.我还想附加字符串"-WIP",如果git status不包含单词nothing to commit, working tree clean

实现此目的的最简单方法是什么?

对于这样的事情,在Maven 3.5.0中有一个解决方案,您可以使用${sha1}${changelist}${revision}用于此类目的。要么是其中之一,要么您可以将它们组合在一起。

<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}${sha1}${changelist}</version>
...
<properties>
<revision>1.3.1</revision>
<changelist>-SNAPSHOT</changelist>
<sha1/>
</properties>
</project>

通过使用上述方法,您可以简单地使用以下方法构建应用程序:

mvn clean package

但也可以这样做:

mvn -Drevision=2.7.1 clean package

根据您的示例,您可以使用:

mvn -Dsha1=-XXXX clean package

其中XXXX可以用从 Git 中提取的信息(描述)替换,甚至可以更好地替换为来自 Jenkins 的信息(GIT_REVISION 等)。

非常重要的提示使用扁平化插件,如 ci 友好文档页面中所述。

好吧,我认为如果你真的希望它以这种方式工作,你必须在你的mvn命令周围编写一个包装器,运行适当的git命令,计算版本字符串后缀,并在调用真正的mvn可执行文件时将其作为-Dversion.suffix=选项传递。

(然后在您的pom中,您将版本设置为类似3.7.${version.suffix}

如果可以找到用于脚本的等效接口,您可能应该确保避免针对人为的接口(例如字符串"无内容可提交,工作树干净")。 (例如,查看git status文档中--porcelain选项的输出格式:https://git-scm.com/docs/git-status)

也就是说,您确定这是一个好主意吗? 不能保证提交次数是一个严格增加的值,如果你有多个开发人员,你最终可能会拥有具有相同版本号的不同版本。 Maven的-SNAPSHOT惯例并没有给你你想要的特殊性,但或多或少地承认你正在寻找的特殊性通常比它的价值更麻烦......

相关内容

最新更新