这个问题是更广泛的 在 Java 项目中自动递增内部版本号
具体来说,我希望 Maven 生成格式的版本major.minor.sequence
其中major.minor
在pom.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
惯例并没有给你你想要的特殊性,但或多或少地承认你正在寻找的特殊性通常比它的价值更麻烦......