【问题标题】:Extract git branch name while building C# project在构建 C# 项目时提取 git 分支名称
【发布时间】:2021-09-27 10:28:32
【问题描述】:

在本地/CI 服务器构建 C# 项目时,我想控制 .csproj 文件中的 NuGet 包引用。如果开发人员在 github ma​​ster 分支(本地/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>

【问题讨论】:

  • IMO 您在本地构建的内容和在 CI 服务器上构建的内容应该 1:1 完全相同。想象一下,如果 PRE 包引入了 RC 不支持的新功能,那么您最多会得到不同的行为,最坏的情况是编译错误
  • 是的,我同意。但是如何控制 NuGet 包引用?你能说说你的想法吗?
  • 不完全确定你在问什么,但是:你的意思是有一个预构建目标,它使用 Exec 任务调用 git branch 然后将其存储到 GitBranch 属性中,然后习惯于选择参考?只要在解决引用之前调用它就应该可以工作,但可能会弄乱 Visual Studio 显示引用的方式。
  • @stijn,我只是在想,是否可以直接在 .csproj 文件中填充 GitBranch 属性,而不是使用预构建事件?如果是,那怎么办?

标签: c# visual-studio msbuild csproj


【解决方案1】:

您可以从 .git/HEAD 文件中读取 git 分支。像

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

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

【讨论】:

  • 谢谢@stjin。我验证了 $GitBranch 道具的值,例如 - 但不幸的是,以下条件是不满意。有什么问题/遗漏?
  • @sanjaykulkarni 查看编辑:缺少额外的 Trim() 调用,因为 HEAD 文件以换行符结尾
  • 非常感谢@stjin 的帮助。它按预期工作。
猜你喜欢
  • 2014-02-12
  • 2017-03-09
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2017-12-22
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多