用于内部版本号的 Maven + Mercurial

Posted

技术标签:

【中文标题】用于内部版本号的 Maven + Mercurial【英文标题】:Maven + Mercurial for Build Numbers 【发布时间】:2011-04-25 11:28:03 【问题描述】:

我不知道如何将 Mercurial 修订 ID 放入我的 Maven 构建中(理想情况下,我希望它出现在我的 jars 和 war 的清单中)。

我能找到的最接近的解决方案是:

mvn -DbuildNumber=`hg id -i`

这不适用于 Windows 或我的 Hudson 服务器。 幸运的是,Hudson 标记了我的构建,但如果构建也使用 Mercurial changset id 进行标记,我希望得到更多保证。

【问题讨论】:

【参考方案1】:

查看this previous question 和已接受答案的链接。基本上,您想要做同样的事情,只是您需要使用带有 Mercurial 的 buildnumber:hgchangeset 目标来获取内容为 hg id -ichangeset 属性。

【讨论】:

【参考方案2】:

很遗憾,hg id -i 太长,无法使用。我创建了一个脚本来计算准确的内部版本号。但是,有两个例外。如果分支上没有以前的版本,则它不能有效。如果本地 repo 有变化,那么它是无效的。在我的构建脚本中,每当发生这种情况时,我都会将构建标记为“x.x.UNSTABLE”。

我使用 REL_PATTERN 来获取当前分支中标记为实际发布的最后一个标签。然后我通过跟踪该版本的提交日志计数 + 自该版本以来对分支的所有提交来计算内部版本号。

#!/bin/bash
REL_PATTERN="release-[0-9]*\.[0-9]*\.[0-9]*"
BRANCH=$( hg branch )
CURR_REV=$( hg id -n )
if [  "$CURR_REV: -1" = "+" ] ; then
  echo "ERROR: This workspace contains uncommitted code. Cannot calculate build number" >&2
  echo "UNSTABLE"
  exit 1
fi
RELEASE=$( hg log --rev="branch($BRANCH) and tag() and 1:$CURR_REV" -T "tags rev\n"|grep "$REL_PATTERN "|tail -1 )
if [ "$RELEASE" = "" ] ; then
  echo "ERROR: Unable to locate version tag" >&2
  echo "UNSTABLE"
  exit 1
fi
RELEASE_REV=$( echo $RELEASE|cut -f 2 -d ' ' )
RELEASE_TAG=$( echo $RELEASE|cut -f 1 -d ' ' )
REVS=$( hg log -P $RELEASE_REV -b $BRANCH -T "rev\n"|wc -l )
BUILD=$( hg log -r1:$CURR_REV -P $RELEASE_REV -b $BRANCH -T "rev\n"|wc -l )
echo "BRANCH=$BRANCH" >&2
echo "CURR_REV=$CURR_REV" >&2
echo "RELEASE_REV=$RELEASE_REV" >&2
echo "RELEASE_TAG=$RELEASE_TAG" >&2
echo "BUILD=$BUILD" >&2
echo $BUILD

【讨论】:

以上是关于用于内部版本号的 Maven + Mercurial的主要内容,如果未能解决你的问题,请参考以下文章

不分散版本号的maven项目层次结构

如何使用 Maven 发布不同版本号的子模块?

Maven传递依赖的时候,同名包不同版本号的包均会下载,可是编译的时候,仅仅会载入一个高版本号的。

Maven的dependency中无版本号的可能情况

Maven的dependency中无版本号的可能情况

增加内部版本号的更好方法?