C#/.NET如何通过CI自动生成并递增NuGet包版本号?
嘿,手动改版本号的坑我太懂了!之前也踩过好几次——要么漏改导致包版本重复,要么改错数字引发依赖混乱,GitVersion确实是解决这个问题的绝佳方案,结合语义化版本控制(SemVer)能完美实现版本自动递增,下面给你一步步拆解实操方案:
第一步:安装GitVersion工具
有两种安装方式,按需选择:
- 全局安装:打开命令行执行
dotnet tool install --global GitVersion.Tool,这样任何Git项目都能直接调用 - 本地项目安装:如果不想全局污染,就在项目根目录执行
dotnet tool install GitVersion.Tool,之后需要用dotnet gitversion前缀来调用命令
第二步:初始化GitVersion配置
在项目根目录运行 gitversion init,这会生成一个GitVersion.yml配置文件——这是版本规则的核心控制文件,你可以根据项目需求调整:
- 默认会遵循SemVer规范,自动根据Git提交记录、标签计算版本
- 常用配置示例:比如设置
mode: Mainline适配主分支持续交付模式,或者tag-prefix: v适配v1.0.0格式的版本标签
第三步:在Visual Studio项目中集成GitVersion
有两种方式让项目构建时自动注入GitVersion生成的版本号:
方式1:直接修改项目文件(.csproj)
在你的类库项目文件里添加以下配置,构建时会自动填充版本相关属性:
<PropertyGroup> <!-- 兜底版本,防止GitVersion未正常运行时出错 --> <GitVersionVersion Condition=" '$(GitVersionVersion)' == '' ">1.0.0</GitVersionVersion> <Version>$(GitVersionVersion)</Version> <PackageVersion>$(GitVersionVersion)</PackageVersion> <AssemblyVersion>$(GitVersionAssemblySemVer)</AssemblyVersion> <FileVersion>$(GitVersionFileSemVer)</FileVersion> </PropertyGroup>
之后用命令行构建时,只需传入GitVersion生成的版本号:dotnet build /p:GitVersionVersion=$(dotnet gitversion /showvariable FullSemVer)
方式2:使用GitVersion MSBuild任务
直接安装NuGet包 GitVersion.MSBuild,这个包会在构建时自动运行GitVersion并填充所有版本属性,不需要手动传参数,省心不少,我自己项目里一直用这种方式。
第四步:理解GitVersion的版本计算逻辑
GitVersion的核心是从Git历史里自动推导版本,核心规则大概是:
- 如果当前分支有版本标签(比如
v2.1.0),就以这个标签为基础版本 - 主分支(main/master)每次提交会自动递增补丁号(比如
2.1.0→2.1.1) - 特性分支(feature/*)会生成预发布版本,格式类似
2.1.1-feature-newapi.3(末尾数字是该分支的提交次数) - 要发布正式版本时,只需要给目标提交打一个版本标签,GitVersion就会直接用这个标签作为正式版本号
第五步:结合CI/CD实现全自动发布
如果用GitHub Actions、Azure DevOps这类流水线工具,只需加入GitVersion的执行步骤即可,比如GitHub Actions的示例:
- name: 安装GitVersion工具 uses: gittools/actions/gitversion/setup@v0.9.15 with: versionSpec: '5.x' - name: 自动计算版本号 id: gitversion uses: gittools/actions/gitversion/execute@v0.9.15 - name: 构建并打包NuGet包 run: dotnet pack --configuration Release --output ./nupkgs /p:Version=${{ steps.gitversion.outputs.fullSemVer }}
这样每次触发流水线时,都会自动计算版本、打包发布,完全不需要手动干预版本号。
内容的提问来源于stack exchange,提问作者walterlv
相关产品推荐
相关产品推荐

