问题描述
此问题是this other one的后续问题。
在那个问题中,有人提到了[assembly: AssemblyVersion(...)]
对文件AssemblyInfo.cs
文件的用法,同时我发现在这样的行之前禁止执行任何处理,唯一允许的是:
[assembly: AssemblyVersion("1.0.0.0" + "-" + Namespace.Class.Attribute)], or:
[assembly: AssemblyVersion("1.0.0.0" + "-" + Namespace.Class.Method())]
原问题:
所以我的问题是:是否有一个Namespace.Class.Attribute
或Namespace.Class.Method()
包含C#应用程序的提交散列(或SHA或缩写SHA)?
进一步调查后编辑
同时,我了解到git describe --always
命令为我提供了我要查找的信息,因此我需要的信息如下:
[assembly: AssemblyVersion("1.0.0.0-" + Launch("git describe --always")]
.但我如何才能执行Launch()
?
我已经知道可以使用System.Diagnostics.Process()
启动命令行命令,如下例所示:
System.Diagnostics.Process.Start(foldervar + "application.exe", "inputfile.txt");
.但这种方式不会捕获该命令的结果。
新问题:
那么,有谁知道如何使用C#一行程序来启动命令行命令并获得结果呢?
提前谢谢
MsBuild
现在可以使用推荐答案属性来设置版本(以及其他属性),而不是使用AssemblyVersionAttribute
。使用MsBuild的优势在于,您可以在生成过程中计算这些值。
这将适用于any "new style"/"SDK style" project。
签出:Assembly attribute properties。
您最终将得到以下内容:
ConsoleApp5.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<!-- Add the property group and the target below to your project file -->
<PropertyGroup>
<GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
<GenerateAssemblyFileVersionAttribute>true</GenerateAssemblyFileVersionAttribute>
<GenerateAssemblyInformationalVersionAttribute>true</GenerateAssemblyInformationalVersionAttribute>
</PropertyGroup>
<Target Name="AddGitShaToAssemblyVersions" BeforeTargets="GetAssemblyVersion" Returns="AssemblyVersion, FileVersion, InformationalVersion">
<Exec ConsoleToMsBuild="true" Command="git describe --always">
<Output TaskParameter="ConsoleOutput" PropertyName="GitSha" />
</Exec>
<PropertyGroup>
<AssemblyVersion>1.1.1.1</AssemblyVersion>
<FileVersion>1.1.1.1-$(GitSha)</FileVersion>
<InformationalVersion>1.1.1.1-$(GitSha)</InformationalVersion>
</PropertyGroup>
</Target>
<!-- Ignore the warning generated for the AssemblyFileVersion -->
<PropertyGroup>
<NoWarn>$(NoWarn);7035</NoWarn>
</PropertyGroup>
</Project>
将在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.
对我来说,这样做的好处是所有逻辑都很好地封装在生成文件本身中,并且不需要在生成之前运行任何命令,也不需要将生成逻辑放入另一个脚本(如PowerShell脚本)中,而这些脚本是Visual Studio不知道的。
请确保从项目中删除现有的手动添加的AssemblyVersion
ETC属性,否则将收到该属性已指定两次的警告。
这篇关于有没有一个C#命令行命令行程序可以帮助我获得应用程序的GIT提交散列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!