构建C#项目时如何提取Git分支名动态选择NuGet包引用版本
实现方案
你的初步思路是正确的,通过GitInfo包获取当前Git分支信息,再配合MSBuild的Choose条件判断分支,就能实现不同分支自动引用对应版本的NuGet包,针对可能出现的边缘场景,我们可以对配置做少量优化:
- 兼容CI环境的分离头检出状态:大部分CI系统执行构建时会默认处于分离头状态,GitInfo无法直接获取到分支名,需要优先读取CI系统内置的分支环境变量
- 避免GitBranch空值报错:调整GitBranch属性的赋值逻辑,确保GitInfo加载完成后再执行Trim操作
优化后的完整.csproj配置
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- 优先读取CI环境的分支变量,兼容GitHub/GitLab等CI系统,没有的话再用GitInfo获取的分支 --> <GitBranch Condition="'$(GITHUB_REF_NAME)' != ''">$(GITHUB_REF_NAME)</GitBranch> <GitBranch Condition="'$(CI_COMMIT_BRANCH)' != '' And '$(GitBranch)' == ''">$(CI_COMMIT_BRANCH)</GitBranch> <GitBranch Condition="'$(GitBranch)' == ''">$(GitBranch)</GitBranch> <!-- 分支名去空格,加条件避免空值报错 --> <GitBranch Condition="'$(GitBranch)' != ''">$(GitBranch.Trim())</GitBranch> </PropertyGroup> <ItemGroup> <PackageReference Include="GitInfo" Version="2.2.0" /> </ItemGroup> <Choose> <When Condition="$(GitBranch) == 'master'"> <ItemGroup> <PackageReference Include="Data.Account.Domain.Messaging" Version="1.0.0-rc*" IncludePrerelease="true" /> </ItemGroup> </When> <Otherwise> <ItemGroup> <PackageReference Include="Data.Account.Domain.Messaging" Version="1.0.0-pre*" IncludePrerelease="true" /> </ItemGroup> </Otherwise> </Choose> </Project>
注意事项
- 本地构建时需要保证项目目录下存在完整的.git文件夹,否则GitInfo无法正常获取分支信息
- 版本号的
*通配符默认会拉取符合规则的最新预发布包,如果需要固定版本可以添加PackageVersionLocked="true"属性 - 若你的主分支名称为main,只需要将条件判断中的
'master'修改为'main'即可 - 首次添加配置后建议执行一次
dotnet restore,确保NuGet引用规则生效
内容的提问来源于stack exchange,提问作者sanjay kulkarni
相关产品推荐
相关产品推荐

