构建 C# 项目时提取 git 分支名称

Extract git branch name while building C# project

在构建 C# 项目 locally/CI 服务器时,我想控制 .csproj 文件中的 NuGet 包引用.如果开发人员在 github master 分支(locally/CI 服务器)上构建 C# 项目,我想添加 RC构建 NuGet 包参考,否则 PRE 发布 NuGet 包参考。这该怎么做?有人可以帮助我吗?

有些想法像 -

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <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/HEAD 文件中读取 git 分支。像

这样的天真的实现
<PropertyGroup>
  <GitBranch>$([System.IO.File]::ReadAlltext('$(MsBuildThisFileDirectory)\.git\HEAD').Replace('ref: refs/heads/', '').Trim())</GitBranch>
</PropertyGroup>

您可能想要调整获取该文件路径的方式,也许使用更强大的东西(例如,如果您只是签出 git 中的随机提交,该文件将不包含分支名称但是提交 SHA)

您还可以使用 GitInfo 本身的变量 $(GitRoot) 来构建路径,这只是对现有代码的一个小改动,但对我必须处理的情况有所帮助带有嵌套文件夹。

<PropertyGroup>  
    <GitBranch>$([System.IO.File]::ReadAlltext('$(GitRoot)\.git\HEAD').Replace('ref: refs/heads/', '').Trim())</GitBranch>
</PropertyGroup>