我们有一个工作流程的要求,基本上意味着我们需要从混帐当前分支外部定义模块的神器版本。
也就是说,如果我们将在git的主分支,我需要<version>master-...</version>
,如果我们都在bugfixX分支,我需要<version>bugfixX-....</version>
的将所生成的伪影为这个pom.xml的。
我以前发现https://github.com/koraktor/mavanagaiata可以提供SHA-1散列的属性,并将其从文档看来,它也可以提供分支,所以也许如果它可以运行早期足够这个过程中我们可以设置的属性,只是把<version>${our.version}</version>
POM中。 如果这是可能的,我非常希望看到一个工作的pom.xml(并奖励500点赏金太)。
如果不是这样,我想我们正在进入或者预处理或“混帐结账”做一些钩子额外的魔法(我还没有尝试过,工作代码将是巨大的)。
我们大楼里这个功能我想咨询一下需要走模块之前,有一个顶层POM,它可以运行生成的属性文件中的“..”。
任何建议如何解决这个问题?
Answer 1:
事实上,Maven可以不与其他目标之一运行改变它自己的项目的版本。 在它的上面,因为据我所知,Maven的不支持在任意属性<version>
标签。 因此,需要单独的执行来运行,这将改变POM的版本的目标。 有哪些可以做各种插件-这种情况下,一个可以使用的versions:set
来自目标versions
插件- http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html
所以,举例如下一个可以执行:
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
其中$branch
变量包含当前的Git分支名称; 它可以与被提取git rev-parse
,这样的:
branch=$(git rev-parse --abbrev-ref HEAD)
但尽管如此,一个需要以某种方式执行。 您可以手动完成,但很繁琐。 所以,我的猜测是,的确是最强大的解决方案是从Git的一侧接近这一点。 那就是 - 一个Git挂钩。 下面是完整的Git post-checkout
钩子将做的工作(相同的代码与上面一些过滤运行挂钩,只有当分支签出,不仅是单个文件):
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
将这个内容的文件PROJECTDIR\.git\hooks\post-checkout
文件。 需要注意的是挂钩的文件应该是可执行文件运行它( chmod +x post-checkout
)。
约几个音符versions
插件-它是非常灵活,且支持多种选择,几乎没有其他目标可能会有帮助,这取决于你的项目结构(你用父母劲歌与否,做孩子的有自己的版本,还是他们从派生母等)。 因此,钩上面可能会略作修改通过使用从其他目标来支持您的具体情况下versions
插件或指定的其他参数。
优点:
- 强大的
- 不需要在pom.xml任何改变文件本身,使这项工作
- 这种“功能”可以简单地通过停用钩(删除或做出不执行)关闭 - 再次,需要在pom.xml没有变化
缺点:
- 回购克隆后,应手动安装(或,你可以提供一个脚本安装钩子,如果假定的Git用户都不敢触碰.git目录里面的东西) - 一个不能强制他人使用挂钩。
UPDATE
此后是钩,这不仅将设置版本分支的名称,也将保留旧版本的后缀更复杂的版本。 例如,提供旧版本master-1.0-SNAPSHOT
,切换到feature1
分支将改变项目版本feature1-1.0-SNAPSHOT
。 这个bash脚本的几个问题遭受(需要分支名称不破折号( -
在名称),只需要根POM的版本),但可能会给如何挂钩可以延长一个想法:给MVN的混合和bash命令可以提取和更新相当多的POM中的信息。
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)
# build new version
version=$branch-$suffix
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
Answer 2:
对不起,重振这个问题,并以非常最近另一种解决方案后,但有可能确实是动态地改变Maven版本,并使用一些git的功能,有点像git describe
会做。
做这个项目是jgitver - Maven的插件 (免责声明;我的作者),它使用jgitver一个jgit基于库,以便从git的信息中得到行家的项目版本。
这是很容易的行家扩展使用
...
<build>
<extensions>
<extension>
<groupId>fr.brouillard.oss</groupId>
<artifactId>jgitver-maven-plugin</artifactId>
<version>0.1.0</version>
</extension>
</extensions>
...
</build>
...
该扩展还可以用来作为一个插件扩展,然后让更多的配置,例如如果你不希望使用快照。 查看项目的全面使用场景的描述页面。
还有一个gradle这个插件可用,做或多或少是相同的。
[编辑1]:答案Thorbjb'rn Ravn的安德森评论
该插件不会修改原来的POM文件或文件的build.gradle。
对于Maven插件,修改在Maven的对象模型内存中完成,并都写入到临时目录中的临时文件。 该计算基于Git的元数据只(标记,提交,...)。
这不修改允许不污染git的历史。 当你感到满意了git的承诺,将其标记git tag -a xyz
和mvn deploy
:这就是全部。
在项目文件的版本,现在是无用的,可以设置为0的例子。
截至今天,并且由于IDEA-155733与Maven插件的IntelliJ工作只是最近EAP版本。 日食和Netbeans的也没问题。
Answer 3:
免责声明:我是作者
我的Maven的核心扩展,无形中设置基于当前分支或者标记的版本。 只要你喜欢,你可以配置定制版本格式模式。
https://github.com/qoomon/maven-branch-versioning-extension
版本格式示例
Answer 4:
如果是足以设置在神器的文件名git的标签和版本信息,你可以使用Maven的jgit-buildnumber-插件 :
<build>
<finalName>${artifactId}-${git.buildnumber}</finalName>
<plugins>
<plugin>
<groupId>ru.concerteza.buildnumber</groupId>
<artifactId>maven-jgit-buildnumber-plugin</artifactId>
<version>1.2.7</version>
<executions>
<execution>
<id>git-buildnumber</id>
<goals>
<goal>extract-buildnumber</goal>
</goals>
<phase>prepare-package</phase>
</execution>
</executions>
</plugin>
<!-- more plugins -->
</plugins>
</build>
Answer 5:
你是否尝试过使用这个插件?: https://github.com/ktoso/maven-git-commit-id-plugin 。 你可以配置它来生成属性以及有关回购状态的所有相关信息文件:
- 科
- 描述
- 的commitid
- buildUserName
- buildUserEmail
- 构建时
- commitUserName
- commitUserEmail
- commitMessageShort
- commitMessageFull
- commitTime
Answer 6:
你检查过buildnumber - Maven的插件,它给你使用git的版本号的机会。 但是,你需要的东西不同。 此外,我会建议做的事情,如:
1.0.0-SNAPSHOT
1.0.0-SNAPSHOT
beeing上主
树枝上,你可以简单的改变的版本
1.0.0-BF-SNAPSHOT
Answer 7:
从行家-3.5.0上有对$ {}修改$ {} SHA1和版本标签内$ {}更改列表属性的支持。 如果,例如要纳入的Git分支名称到版本的CI构建工作,此功能可能足以为你的目的。 见Maven的CI友好版本
基本上,在你的pom.xml通过更换固定的版本:
<version>${revision}${changelist}</version>
通过创建一个文件设置为项目中的根目录的修订和变更列表默认值.mvn/maven.config
包含:
-Drevision=1.2.3
-Dchangelist=-SNAPSHOT
检查该文件版本控制,当你碰到你的项目的修订更新。
在你的CI系统,你就可以覆盖使用的Git分支名称的清理后表示变更表变量,例如。
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD | sed -E -e 's@[^0-9A-Za-z.-]+@-@g')
mvn clean install -Dchangelist="-${BRANCHNAME}"
(您可能更喜欢git symbolic-ref --short HEAD
用于获取的分支名称,因人而异)
你的神器由分支的CI系统内置feature/branchname
届时将有一个版本分支的后缀,如:
yourproject-1.2.3-feature-branchname.jar
而谁不使用任何替代仍然会打造为开发者:
yourproject-1.2.3-SNAPSHOT.jar
文章来源: Deriving maven artifact version from git branch