如何通过条件化构建编号按分支发布正式/预发布NuGet包?
解决NuGet分支区分正式/预发布包版本的问题
我之前做自动化NuGet部署时也碰到过一模一样的需求——master分支出正式包,test分支出带-beta的预发布包,折腾了几种方法,下面分享几个最靠谱的实现思路:
方法一:用构建脚本动态设置版本后缀(适用于Azure DevOps/GitHub Actions等CI系统)
这个方法灵活度最高,不管你用什么CI工具都能适配:
- 先把自动版本控制改回「使用构建编号」,保证基础版本号(比如
1.0.$(Build.BuildId))能正常生成 - 添加一个脚本步骤(PowerShell或Bash),根据当前分支设置版本后缀变量:
举个PowerShell的例子(Azure DevOps适用):
如果是GitHub Actions,脚本可以改成这样:# 根据分支名判断是否添加beta后缀 if ($env:BUILD_SOURCEBRANCHNAME -eq "test") { # 设置环境变量,后续打包步骤可以引用 Write-Host "##vso[task.setvariable variable=VersionSuffix]-beta" } else { # 正式分支清空后缀 Write-Host "##vso[task.setvariable variable=VersionSuffix]" }- name: 配置版本后缀 id: set_suffix run: | if [ "${{ github.ref_name }}" = "test" ]; then echo "suffix=-beta" >> $GITHUB_OUTPUT else echo "suffix=" >> $GITHUB_OUTPUT fi - 最后在NuGet打包步骤(比如
dotnet pack)里,引用这个变量:
这样test分支构建出来的包就会自动带上dotnet pack --version-suffix $(VersionSuffix) --configuration Release-beta后缀,master分支则生成无后缀的正式包。
方法二:用MSBuild配置文件实现分支判断
如果不想写脚本,可以用MSBuild的条件属性来实现,更贴近项目配置:
- 在项目根目录创建
Directory.Build.props文件,添加以下内容:<Project> <PropertyGroup> <!-- 当分支为test时添加-beta后缀 --> <VersionSuffix Condition="'$(Build.SourceBranchName)' == 'test'">-beta</VersionSuffix> <!-- 其他分支(比如master)清空后缀 --> <VersionSuffix Condition="'$(Build.SourceBranchName)' != 'test'"></VersionSuffix> </PropertyGroup> </Project> - 确保你的CI系统会把分支名称作为环境变量
Build.SourceBranchName传递给MSBuild(大部分主流CI工具默认都会传),这样打包时MSBuild会自动根据分支添加对应的后缀。
注意事项
- 分支名称判断要精准:如果CI传递的是完整的分支路径(比如
refs/heads/test),记得先提取分支名部分,比如用$env:BUILD_SOURCEBRANCH -replace 'refs/heads/',''来处理 - 基础版本号要统一:正式包和预发布包的主版本、次版本建议保持一致,避免版本号混乱(比如正式包是
1.0.123,预发布包就是1.0.123-beta) - 测试时先手动触发分支构建,查看生成的NuGet包版本是否符合预期,再开启自动触发
内容的提问来源于stack exchange,提问作者AXMIM
相关产品推荐
相关产品推荐

