0

我正在尝试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

欢迎任何指点。

4

0 回答 0