在C#项目中覆盖BuildDependsOn的问题

时间:2019-02-15 05:15:48

标签: .net msbuild

我正在尝试按照此处的文档https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017进行操作,以将简单的Target添加到.NET Core项目文件的构建管道中。但是,我做错了,但看不到。

我已经获取了一个简单的“ Hello World”项目文件,添加了一个仅打印消息的简单目标,并按照文档建议重新定义了BuildDependsOn来获取:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>

    <BuildDependsOn>
      Target1;
      $(BuildDependsOn)
    </BuildDependsOn>
  </PropertyGroup>

  <Target Name="Target1">
    <Message Text="Running Target1" Importance="high" />
  </Target>

</Project>

当我尝试使用msvc2017或dotnet CLI(“ dotnet build -c Release Hello.csproj”)“构建”该项目时,该消息不会打印。

当我使用msbuild查看经过完全预处理的项目时,我可以清楚地看到BuildDependsOn属性的定义。我不确定为什么我的重新定义没有用。我还尝试过对RebuildDependsOn进行同样的操作,但效果相同。

有什么建议吗?我在这里想念什么?

预先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

之所以无法正常工作,是因为您有一个SDK风格的项目:<Project Sdk="Microsoft.NET.Sdk">

请注意,

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
</Project>

等效于此:

<Project>
  <!-- Implicit top import -->
  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>

  <!-- Implicit bottom import -->
  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

在项目结束时隐式导入Sdk.targets会覆盖BuildDependsOn的定义。

您可以改为显式添加导入,然后在BuildDependsOn导入之后添加Sdk.targets的定义。

<Project>
  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <Target Name="Target1">
    <Message Text="Running Target1" Importance="high" />
  </Target>

  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />

  <PropertyGroup>
    <BuildDependsOn>
      Target1;
      $(BuildDependsOn)
    </BuildDependsOn>
  </PropertyGroup>
</Project>

请参见How to: Extend the Visual Studio build processHow to: Use MSBuild project SDKs

答案 1 :(得分:0)

我更喜欢添加一个依赖于其他内容的构建目标的方法是whenCompleteBeforeTargets。 记录在这里: https://docs.microsoft.com/en-us/visualstudio/msbuild/target-build-order?view=vs-2017

我认为这要简单得多,并且我添加的XML可能更少。

AfterTargets