gpt4 book ai didi

git - 从git分支派生maven Artifact 版本

转载 作者:IT王子 更新时间:2023-10-29 00:40:45 24 4
gpt4 key购买 nike

我们有一个工作流要求,这实际上意味着我们需要从 git 中的当前分支外部定义模块的 Artifact 版本。

即如果我们在 git 的主分支上,我需要 <version>master-...</version>如果我们在 bugfixX 分支上,我需要 <version>bugfixX-....</version>为这个 pom.xml 生成的 Artifact 。

我之前发现 https://github.com/koraktor/mavanagaiata可以提供 SHA-1 散列作为属性,从文档中可以看出它也可以提供分支,所以也许如果它可以在过程中足够早地运行,我们可以设置属性并只输入 <version>${our.version}</version>在 pom。如果可能的话,我非常希望看到一个有效的 pom.xml(并为此奖励 500 点赏金)。

如果没有,我想我们要么进行预处理,要么“git checkout”用一些钩子(Hook)做额外的魔法(我还没有尝试过,工作代码也会很棒)。

我们有一个顶级 pom,可以在构建模块之前运行它以在“..”中生成一个属性文件,我询问的这个功能需要去哪里。

关于如何解决这个问题有什么建议吗?

最佳答案

确实,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 钩子(Hook)。这是完整的 Git post-checkout将完成这项工作的钩子(Hook)(与上面相同的代码,带有一些过滤以仅在 checkout 分支时运行钩子(Hook),而不是仅在单个文件时运行钩子(Hook)):

#!/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文件。请注意, Hook 文件应该是可执行文件才能运行它 ( chmod +x post-checkout )。

关于versions的一些注意事项插件 - 它非常灵活,支持许多选项,并且几乎没有其他可能有帮助的目标,具体取决于您的项目结构(您是否使用父 poms,子项是否有自己的版本,或者它们是否从父项派生,等等。 ).因此,上面的 Hook 可能会稍微修改以通过使用来自 versions 的其他目标来支持您的特定情况。插件或通过指定附加参数。

优点:

  • 健壮
  • 无需更改 pom.xml 文件中的任何内容即可完成这项工作
  • 可以简单地通过停用 Hook (删除或使其不可执行)来关闭此“功能”——同样,不需要在 pom.xml 中进行任何更改

缺点:

  • 不能强制其他人使用 Hook - 它应该在克隆 repo 后手动安装(或者,如果假设 Git 用户害怕接触 .git 目录中的东西,您可以提供脚本来安装 Hook ).

更新

下面是更复杂版本的hook,不仅会把version设置为分支名,还会保留老版本的后缀。例如,提供旧版本 master-1.0-SNAPSHOT , 切换到 feature1分支会将项目的版本更改为feature1-1.0-SNAPSHOT .这个 bash 脚本遇到了一些问题(需要名称中没有破折号符号( - )的分支名称,并且只采用根 pom 的版本),但可能会给出如何扩展钩子(Hook)的想法:给定混合您可以使用 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'

关于git - 从git分支派生maven Artifact 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com