我正在尝试Directory.Build.*
为我的 SDK 样式文件编写一个csproj
文件。它应该注入一个通用产品版本(来自VERSION.txt
)并向其中添加 git 哈希。
我只有关于 MSBuild 的基本知识,我知道如何查找 SDK 使用的属性,并且这些属性首先在评估阶段设置。我还在文档中找到了属性函数和目标定义。
对于此工作示例,该csproj
文件仅包含:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
以下Directory.Build.props
只有评估阶段的东西在做时有效dotnet build /p:VcsDesc=123
:
<Project>
<PropertyGroup>
<Version>$([System.IO.File]::ReadAllText($([MSBuild]::GetPathOfFileAbove("VERSION.txt"))))+vcs$(VcsDesc)</Version>
</PropertyGroup>
</Project>
为了自动检索VcsDesc
我尝试定义一个目标
<Target Name="Foo" Outputs="VcsDesc">
<Exec Command="git describe --always --tags --dirty" ConsoleToMSBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="VcsDesc" />
</Exec>
<Message Importance="High" Text="VCS Descriptor = $(VcsDesc)" />
</Target>
当我将其定义为InitialTargets="Foo"
onDirectory.Build.props
或添加DependsOnTargets="BeforeBuild"
. 我知道它会被执行,因为我看到了带有正确输出的消息git
。但是 SDK 没有选择该属性(我发现它在生成的 NuGet 规范中丢失了)。
我试过了
- 使用
Directory.Build.targets
而不是Directory.Build.props
- 设置最终以默认 1.0.0 版本结束
Version
的目标内部Foo
Outputs
从目标中移除DependsOnTargets="Build"
代替BeforeBuild
我认为我执行目标太早了,但我不知道在哪里可以找到合适的目标DependsOnTargets
。
欢迎任何指点。