.NET Core - 覆盖默认构建目标

vel*_*koz 5 msbuild csproj asp.net-core asp.net-core-2.0

我有一个我想在Visual Studio解决方案中包含的角度项目.我添加了一个类型为ASP.NET Core 2/Empty的新项目,其中包含所有文件,不包括node_modules和类似的文件,直接通过csproj中的通配符.

我遇到的问题是覆盖默认构建目标 - 当触发构建目标时,我想调用"ng build",但这不会发生.关于这一点的一些材料可以在这里这里找到

1尝试覆盖默认构建目标:

 <Target Name="Build">
    <Message Importance="high" Text="Overriding default build" />
 </Target>
Run Code Online (Sandbox Code Playgroud)

但它仍然没有执行.

2试图指定DefaultTargets,但它不会被调用相同:

 <Project DefaultTargets="NgBuild" Sdk="Microsoft.NET.Sdk.Web">
   ...
 <Target Name="NgBuild">
    <Message Importance="high" Text="Overriding default build" />
 </Target>
Run Code Online (Sandbox Code Playgroud)

只有在我添加属性之后BeforeTargets="Build",消息就在那里.

所以问题是 - 如何覆盖默认构建行为?最终,我想要一个将在其中调用的目标,<Exec Command="ng build">并且不会产生.exe并且不需要项目中的任何.cs文件.

Mar*_*ich 10

Build目标未被覆盖的原因是因为在加载自定义目标时尚未定义目标 - 默认目标会覆盖您的自定义目标.

如果使用基于SDK的项目文件<Project Sdk="…">,则会在项目文件之前和之后自动导入SDK道具和目标文件(只有两个msbuild项目文件).该Build目标是通过该项目的内容后到来,因此会覆盖在项目文件中定义一个进口实际定义.

如果你真的想要覆盖Build目标(稍后会详细介绍),我建议你从隐式SDK导入转移到显式SDK导入:

<Project>
  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk.Web" />
  <!-- Project content -->
  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" />
  <Target Name="Build">
    <!-- this will override the default Build target. -->
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

但是,SDK是围绕编译和生成.NET程序集而构建的.您可能会发现覆盖Build目标可能会导致意外结果,包括您的项目无法生成可由其他项目引用的输出(如果您需要).

如果您只是想为项目添加构建步骤,我建议添加一个挂钩到现有构建过程的自定义目标:

<Target Name="NgBuild" BeforeTargets="BeforeBuild">
  <Exec Command="ng build" />
</Target>
Run Code Online (Sandbox Code Playgroud)