You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:21