我正在寻找一种简单的方法来将
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 文件似乎无法运行。没有错误。
批处理文件在构建后的
PostBuildEvent
中运行。即它似乎没有做任何事情,因为它在过程中运行得很晚,最重要的是,在编译之后运行。
从评论中的讨论来看,该项目似乎是一个针对 .Net Framework 的“传统”风格项目。
C# 项目文件 (.csproj) 是 MSBuild XML 文件。 msbuild 文件中的顶级文档根元素是
Project
。 “Sdk”风格的项目将在 Project
元素上具有“Sdk”属性。 “遗留”项目不会。
“Sdk”项目支持一组属性,用于指定许多常见的程序集属性。由于可以通过环境变量和命令行设置属性,因此构建系统很容易注入适当的值。
“遗留”项目没有属性。 (但我们并没有被卡住。)
代码
[assembly: AssemblyInformationalVersion("myversionstring")]
是 Attribute 的语法。
assembly:
指定属性的target。
这行代码可以出现在任何源文件中。
AssemblyInfo.cs
文件或名称没有什么特别的。
一个给定的程序集属性只能为一个程序集指定一次。在源代码中的任何地方重复相同的程序集属性是错误的。
例如以下代码是编译时错误。将这两行放在同一个项目的不同文件中仍然是一个错误。
[assembly: AssemblyInformationalVersion("foo")]
[assembly: AssemblyInformationalVersion("bar")]
项目模板中的
AssemblyInfo.cs
不包括AssemblyInformationalVersion
所以不应该有重复问题。但需要注意的是,如果您决定动态更新出现在 AssemblyInfo.cs
文件中的其他属性。
WriteCodeFragment
的任务被添加到 MSBuild。尽管有这个名字,这个任务(目前)不能编写任何通用代码片段。但这没关系,因为它能够编写的唯一一种代码片段是程序集属性代码片段。添加此任务是为了支持“Sdk”样式项目,幸运的是,它已作为通用任务添加到 MSBuild 本身。
动态注入一个
AssemblyInformationalVersion
:
BeforeCompile
WriteCodeFragment
创建定义属性的新文件Include
Compile
项目中的新文件稍后我会尝试用一些示例代码更新这个答案。