在Visual Studio应用程序中包括Git标记

pcww981p  于 2023-03-16  发布在  Git
关注(0)|答案(1)|浏览(146)

我正在寻找一种简单的方法来将git describe --t --dirty的输出包含在WPF程序的标题栏中。
我看过MSBuild.Community.Tasks,但是我对构建过程不是很了解。我没有找到很多最新的信息或任何教程,为我把所有的部分放在一起。
我试着写一个批处理文件来给AssemblyInfo.cs添加一个属性:

@echo off
echo "Append Git Version Property"

for /F "tokens=* USEBACKQ" %%F IN (`git describe --tags --dirty`) DO (
set var=%%F
)
echo Version: %var%
set statement=[assembly: AssemblyInformationalVersion(" %var% ")]
echo Property: %statement%
echo %statement% >> AssemblyInfo.cs

如果我从资源管理器运行它,这似乎可以工作。我想,将此添加到我的项目文件中应该会在构建完成后运行它。

<PropertyGroup>
    <PostBuildEvent>cmd  (SolutionDir)\Properties\gitVersion.bat</PostBuildEvent>
</PropertyGroup>

当我进行构建时,它似乎根本没有改变文件。我需要让它真正添加属性。
我不知道是否每次构建都会创建一个新文件。如果没有,我每次都会在文件的末尾附加一个新属性。这可不太好。
更新--不管有什么其他问题,至少我从项目文件运行它的方式有问题。我将输出更改为我创建的文件,并将其更改为预构建事件。bat文件似乎无法运行。没有错误。
更新2:我不确定我是应该继续这个问题还是开始一个新的问题。如果我违反了礼仪,请告诉我。
根据多德先生的评论我在计划中增加了一个目标。

<Target Name="GitVersionAttribute" BeforeTargets="BeforeBuild">
    <Exec Command="git describe --tags --dirty &gt; $(IntermediateOutputPath)version.txt" />
    <ReadLinesFromFile File="$(IntermediateOutputPath)version.txt">
      <Output TaskParameter="Lines" PropertyName="VersionAttribute" />
    </ReadLinesFromFile>
    <WriteCodeFragment AssemblyAttributes="GitVersionAttribute" Language="C#" OutputDirectory="Properties" OutputFile="GitVersionAttribute.cs" />
    <ItemGroup>
      <Compile Include="Properties\GitVersionAttribute.cs" />
    </ItemGroup>
  </Target>

我添加了一个RunCommand来获取git describe的返回值,但我仍然不知道如何设置GitVersionAttribute的值。

sd2nnvve

sd2nnvve1#

批处理文件在构建之后的PostBuildEvent中运行,也就是说,它看起来没有做任何事情,因为它在过程中运行得很晚,最重要的是,在编译之后。
从评论中的讨论来看,该项目似乎是一个针对.Net Framework的“遗留”风格的项目。
C#项目文件(.csproj)是MSBuild XML文件。msbuild文件中的顶级文档根元素是Project。“Sdk”样式的项目在Project元素上具有“Sdk”属性。“Legacy”项目则没有。
“Sdk”项目支持一组属性,用于指定许多常见的程序集特性。由于可以通过环境变量和命令行设置属性,因此生成系统很容易注入适当的值。
“遗留”项目不具备这些属性。(但我们并没有陷入困境。)
守则

[assembly: AssemblyInformationalVersion("myversionstring")]

Attribute的语法。assembly:指定属性的目标。
这行代码可以出现在任何源文件中,AssemblyInfo.cs文件或名称没有什么特别之处。
给定的程序集属性只能为一个程序集指定一次。在源中的任何位置重复相同的程序集属性都是错误的。
下面的代码是一个编译时错误。把这两行放在同一个项目的不同文件中仍然是一个错误。

[assembly: AssemblyInformationalVersion("foo")]
[assembly: AssemblyInformationalVersion("bar")]

项目模板中的AssemblyInfo.cs不包含AssemblyInformationalVersion,所以不应该有重复的问题。但是如果你决定动态更新AssemblyInfo.cs文件中出现的其他属性,这是需要注意的。
在Visual Studio 2015中,向MSBuild中添加了一个名为WriteCodeFragment的任务。(目前)能够编写任何泛型代码片段。但这没关系,因为它唯一能够编写的代码片段类型是程序集属性代码片段。添加此任务是为了支持“Sdk”风格的项目,谢天谢地,它被添加到MSBuild本身作为一个通用任务。
要动态插入AssemblyInformationalVersion
1.将值传递到msbuild进程
1.创建设置为执行BeforeCompile的目标
1.在目标中
1.使用WriteCodeFragment创建定义属性的新文件

  1. IncludeCompile项目中的新文件
  • 我稍后会尝试使用一些示例代码更新此答案。*

相关问题