将任务输出传递给 Microsoft.NET.Sdk

问题描述

我正在尝试为我的 SDK 样式的 Directory.Build.* 文件编写一个 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" 上将其定义为 Directory.Build.props添加 DependsOnTargets="BeforeBuild" 时,它会被执行。我知道它会被执行,因为我看到来自 git 的正确输出的消息。但是,SDK 并未选择该属性(我发现它在生成的 NuGet 规范中缺失)。

我试过了

  • 使用 Directory.Build.targets 而不是 Directory.Build.props
  • Version 目标内设置 Foo,最终使用认 1.0.0 版本
  • 从目标中删除 Outputs
  • DependsOnTargets="Build" 而不是 BeforeBuild

我认为我执行目标太早了,但我不知道在哪里可以找到合适的目标来放入 DependsOnTargets

欢迎任何指点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...