我正在寻找一种简单的方法来将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 > $(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的值。
1条答案
按热度按时间sd2nnvve1#
批处理文件在构建之后的
PostBuildEvent
中运行,也就是说,它看起来没有做任何事情,因为它在过程中运行得很晚,最重要的是,在编译之后。从评论中的讨论来看,该项目似乎是一个针对.Net Framework的“遗留”风格的项目。
C#项目文件(.csproj)是MSBuild XML文件。msbuild文件中的顶级文档根元素是
Project
。“Sdk”样式的项目在Project
元素上具有“Sdk”属性。“Legacy”项目则没有。“Sdk”项目支持一组属性,用于指定许多常见的程序集特性。由于可以通过环境变量和命令行设置属性,因此生成系统很容易注入适当的值。
“遗留”项目不具备这些属性。(但我们并没有陷入困境。)
守则
是Attribute的语法。
assembly:
指定属性的目标。这行代码可以出现在任何源文件中,
AssemblyInfo.cs
文件或名称没有什么特别之处。给定的程序集属性只能为一个程序集指定一次。在源中的任何位置重复相同的程序集属性都是错误的。
下面的代码是一个编译时错误。把这两行放在同一个项目的不同文件中仍然是一个错误。
项目模板中的
AssemblyInfo.cs
不包含AssemblyInformationalVersion
,所以不应该有重复的问题。但是如果你决定动态更新AssemblyInfo.cs
文件中出现的其他属性,这是需要注意的。在Visual Studio 2015中,向MSBuild中添加了一个名为
WriteCodeFragment
的任务。(目前)能够编写任何泛型代码片段。但这没关系,因为它唯一能够编写的代码片段类型是程序集属性代码片段。添加此任务是为了支持“Sdk”风格的项目,谢天谢地,它被添加到MSBuild本身作为一个通用任务。要动态插入
AssemblyInformationalVersion
:1.将值传递到msbuild进程
1.创建设置为执行
BeforeCompile
的目标1.在目标中
1.使用
WriteCodeFragment
创建定义属性的新文件Include
Compile
项目中的新文件