如何在Git合并时自动递增NuGet包版本
自动递增NuGet包版本号(合并至Master分支时)
核心思路
通过CI流水线动态生成递增版本号,分两种实现方式:不修改.csproj文件(满足无需保存版本号的需求)和修改.csproj并提交版本更新(满足"能保存更佳"的需求),最终通过dotnet pack的/p:Version参数指定新版本,生成更高版本的NuGet包。
方案一:不修改.csproj,动态生成版本号
直接从现有.csproj读取基础版本,递增修订号后传入打包命令,不改动源文件。
修改后的GitLab CI脚本
script: - echo "Creating nuget package" # 安装xmlstarlet用于读取.csproj中的版本号(Ubuntu镜像适用) - apt-get update && apt-get install -y xmlstarlet # 读取当前.csproj中的版本号 - BASE_VERSION=$(xmlstarlet sel -t -v "/Project/PropertyGroup/Version" YourProject.csproj) # 拆分版本号为 major.minor.patch 并递增修订号 - IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION" - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - echo "Generated new version: $NEW_VERSION" # 构建并打包,指定新版本号 - dotnet restore - dotnet build -c release /p:Version=$NEW_VERSION - dotnet pack -c release -o publish /p:Version=$NEW_VERSION # 推送NuGet包 - dotnet nuget add source "${SOURCE}" --name gitlab --username "${TOKEN_NAME}" --password "${TOKEN_PASSWORD}" --store-password-in-clear-text - dotnet nuget push "publish/*.nupkg" --source gitlab
替代方案(用Git标签追踪版本)
如果习惯用Git标签(如v1.1.0)管理版本,可替换版本生成逻辑,避免依赖.csproj中的手动配置:
# 读取最新Git标签(无标签时默认v0.0.0) - LATEST_TAG=$(git describe --abbrev=0 --tags 2>/dev/null || echo "v0.0.0") - BASE_VERSION=${LATEST_TAG#v} - IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION" - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH"
方案二:修改.csproj并提交新版本号
如果需要将新版本号持久化到.csproj中,可在生成版本后修改文件并推送回master分支(需配置CI有仓库推送权限)。
修改后的GitLab CI脚本
script: - echo "Creating nuget package and bumping version" # 安装xmlstarlet - apt-get update && apt-get install -y xmlstarlet # 生成新版本号(同方案一) - BASE_VERSION=$(xmlstarlet sel -t -v "/Project/PropertyGroup/Version" YourProject.csproj) - IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION" - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - echo "New version: $NEW_VERSION" # 修改.csproj中的版本号 - xmlstarlet ed -u "/Project/PropertyGroup/Version" -v "$NEW_VERSION" YourProject.csproj # 提交并推送版本更新(添加[skip ci]避免触发循环流水线) - git config user.name "CI Version Bot" - git config user.email "ci-bot@your-domain.com" - git add YourProject.csproj - git commit -m "Auto bump version to $NEW_VERSION [skip ci]" # 用CI token推送(需确保TOKEN_NAME/TOKEN_PASSWORD有仓库push权限) - git push https://${TOKEN_NAME}:${TOKEN_PASSWORD}@${CI_PROJECT_URL#https://}.git master # 构建打包并推送NuGet包 - dotnet restore - dotnet build -c release /p:Version=$NEW_VERSION - dotnet pack -c release -o publish /p:Version=$NEW_VERSION - dotnet nuget add source "${SOURCE}" --name gitlab --username "${TOKEN_NAME}" --password "${TOKEN_PASSWORD}" --store-password-in-clear-text - dotnet nuget push "publish/*.nupkg" --source gitlab
注意事项
- 镜像适配:如果使用Windows镜像,需用PowerShell替代bash命令读取/修改xml,示例:
$xml = [xml](Get-Content YourProject.csproj) $baseVersion = $xml.Project.PropertyGroup.Version $parts = $baseVersion -split '\.' $newPatch = [int]$parts[2] + 1 $newVersion = "$($parts[0]).$($parts[1]).$newPatch" - 权限配置:方案二需要在GitLab项目设置中,给CI/CD的token赋予
Maintainer或Developer权限(确保能push到master)。 - 版本规则扩展:可根据需求修改版本递增逻辑,比如递增次要版本号(
MINOR=$((MINOR+1))),或添加预发布标签(如$NEW_VERSION-ci.$CI_PIPELINE_ID)。
内容的提问来源于stack exchange,提问作者110mat110
相关产品推荐
相关产品推荐

