是否有一个 C# 命令行命令可以帮助我获取应用程序的 GIT 提交哈希值?

Dom*_*que 5 .net c# versioning git command-line

这个问题是另一个问题的后续问题。

[assembly: AssemblyVersion(...)]在这个问题中,有人提到了文件file的用法AssemblyInfo.cs,同时我发现禁止在这样的行之前执行任何处理,唯一允许的是:

[assembly: AssemblyVersion("1.0.0.0" + "-" + Namespace.Class.Attribute)], or:
[assembly: AssemblyVersion("1.0.0.0" + "-" + Namespace.Class.Method())]
Run Code Online (Sandbox Code Playgroud)

原始问题:
所以我的问题:是否有一个Namespace.Class.AttributeorNamespace.Class.Method()包含 C# 应用程序的提交哈希(或 sha 或缩短的 sha)?

经过更多调查后进行编辑
同时,我了解到该命令为git describe --always我提供了我正在寻找的信息,所以我需要的是:

[assembly: AssemblyVersion("1.0.0.0-" + Launch("git describe --always")]
Run Code Online (Sandbox Code Playgroud)

...但是我该如何执行呢Launch()

我已经知道我可以使用 启动命令行命令System.Diagnostics.Process(),如下例所示:

System.Diagnostics.Process.Start(foldervar + "application.exe", "inputfile.txt");
Run Code Online (Sandbox Code Playgroud)

...但是这种方式无法捕获该命令的结果。

新问题:
那么,有人知道用于启动命令行命令并获取结果的 C# 语句吗?

提前致谢

ste*_*and 7

正如 Lasse V. Karslen 已经评论的那样,您的代码将触发编译器错误CS0182。下一个问题是 AssemblyVersion 所需的格式 - Major[.minor[.build[.revision]]],还有其他可用于字符串的程序集元数据字段 - 例如InformationalVersion

在构建时添加程序集元数据的方法不止一种......可能不止这五种:

  • 装配属性
  • dotnet-cli 参数
  • msbuild参数
  • csproj 配置条目
  • 构建事件/脚本也是实现目标的一种方法,但更麻烦。

使用程序集属性

程序集属性的问题在于它需要是常量表达式。这并不是直接实现的,但Gitinfo设法提供了一个解决方案。另一个缺点是需要禁用编译器生成 AssemblyInfo.cs,这会中断将csproj 中配置的某些值写入最终程序集。

安装gitinfo

PM> Install-Package GitInfo
Run Code Online (Sandbox Code Playgroud)

在您的csproj文件中设置

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
Run Code Online (Sandbox Code Playgroud)

添加/创建AssemblyInfo .cs

[assembly: AssemblyInformationalVersion(ThisAssembly.Git.Commit)]
Run Code Online (Sandbox Code Playgroud)

使用 dotnet-cli(使用 powershell)

那是直截了当的。

$GitHash=git describe --always
dotnet build -p:InformationalVersion=$GitHash
Run Code Online (Sandbox Code Playgroud)

使用修改后的 csproj

修改csproj文件是ci中常用的方法。

将“InformationVersion”添加到您的 csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <InformationalVersion>$(GitHash)</InformationalVersion>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

在构建“git describe --always”的输出之前设置环境变量“GitHash”:

$env:GitHash=git describe --always
dotnet build
Run Code Online (Sandbox Code Playgroud)

例如,GithubactionsHellowWord是一个项目示例,它使用环境变量中内置的 github actions 将 sha1 哈希写入程序集元数据

浏览器将在“产品版本”字段中显示 informationalVersion 的值。

装配属性


jes*_*ing 5

AssemblyVersionAttribute您现在可以使用 MsBuild 属性来设置版本(以及其他属性),而不是使用。使用 MsBuild 的优点是您可以在构建过程中计算这些值。

这适用于任何“新风格”/“SDK 风格”项目

查看:程序集属性 属性

你最终会得到如下结果:

ConsoleApp5.csproj:
Run Code Online (Sandbox Code Playgroud)
ConsoleApp5.csproj:
Run Code Online (Sandbox Code Playgroud)

文件夹中会生成一个文件obj,并自动包含在构建中。您可以在编辑器中打开此文件以查看生成的内容:

在此输入图像描述

生成的内容:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("ConsoleApp5")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.1-3654148")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1.1-3654148")]
[assembly: System.Reflection.AssemblyProductAttribute("ConsoleApp5")]
[assembly: System.Reflection.AssemblyTitleAttribute("ConsoleApp5")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.1")]

// Generated by the MSBuild WriteCodeFragment class.
Run Code Online (Sandbox Code Playgroud)

对我来说,优点是所有逻辑都很好地封装在构建文件本身中,并且不依赖于我必须在构建之前运行任何命令或将构建逻辑放入另一个脚本中,例如 powershell 脚本、Visual Studio 的脚本不知道。

请确保AssemblyVersion从项目中删除现有的、手动添加的等属性,否则您最终会收到一条警告,该属性被指定了两次。