如何在Visual Studio 2017中使用BeforeBuild和AfterBuild目标?

nat*_*ter 15 .net msbuild csproj .net-core visual-studio-2017

升级到csproj以使用Visual Studio 2017和Microsoft.NET.Sdk后,我的"BeforeBuild"和"AfterBuild"目标不再运行.我的文件看起来像这样:

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

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

  <!-- my targets that don't run -->
  <Target Name="BeforeBuild">
      <Message Text="Should run before build" Importance="High" />
  </Target>

  <Target Name="AfterBuild">
      <Message Text="Should run after build" Importance="High" />
  </Target>

</Project>
Run Code Online (Sandbox Code Playgroud)

Pau*_*her 19

相关的MSBuild git的问题,建议使用BeforeBuild/AfterBuild作为任务名称前进,而不是适当命名的任务和接线对抗目标

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

  <!-- Instead of BeforeBuild target -->
  <Target Name="MyCustomTask" BeforeTargets="CoreBuild" >
      <Message Text="Should run before build" Importance="High" />
  </Target>

  <!-- Replaces AfterBuild target -->
  <Target Name="AnotherCustomTarget" AfterTargets="CoreCompile">
      <Message Text="Should run after build" Importance="High" />
  </Target>    
</Project>
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个惯用的VS 2017项目文件,但是您之前/之后触发的目标仍然是此时的一些争论问题


nat*_*ter 8

指定时Project Sdk="Microsoft.NET.Sdk",您使用的是"隐式顶部和底部导入".这意味着在csproj文件的底部有一个不可见的导入到Microsoft.NET.Sdk/Sdk.targets,它覆盖了"BeforeBuild"和"AfterBuild"目标.

您可以使用显式导入来解决此问题,以便您可以控制导入顺序.

<Project>

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

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

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

  <!-- add your custom targets after Sdk.targets is imported -->
  <Target Name="BeforeBuild">
      <Message Text="Should run before build" Importance="High" />
  </Target>

  <Target Name="AfterBuild">
      <Message Text="Should run after build" Importance="High" />
  </Target>

</Project>
Run Code Online (Sandbox Code Playgroud)


Geo*_*dze 5

在已经提到的 GitHub 问题中, Rainer Sigwald提供了更短更优雅的解决方案:

<Target Name="CustomBeforeBuild" BeforeTargets="BeforeBuild"> ... </Target>
<Target Name="CustomAfterBuild" AfterTargets="AfterBuild"> ... </Target>
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪,但工作正常。