首页 > 解决方案 > 在 C# 项目中覆盖 BuildDependsOn 时遇到问题

问题描述

我正在尝试遵循此处的文档- 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的效果,但效果相同。

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

在此先感谢您的帮助!

标签: .netmsbuild

解决方案


事情没有像您期望的那样工作的原因是因为您有一个 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>

请参阅如何:扩展 Visual Studio 构建过程如何:使用 MSBuild 项目 SDK


推荐阅读