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

时间:2017-11-08 12:24:54

标签: asp.net-core msbuild asp.net-core-2.0 csproj

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

我遇到的问题是覆盖默认构建目标 - 当触发构建目标时,我想调用“ng build”,但这不会发生。有关此问题的一些材料可以在herehere

找到

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

 <Target Name="Build">
    <Message Importance="high" Text="Overriding default build" />
 </Target>

但它仍然没有执行。

2尝试指定DefaultTargets,但不会调用它:

 <Project DefaultTargets="NgBuild" Sdk="Microsoft.NET.Sdk.Web">
   ...
 <Target Name="NgBuild">
    <Message Importance="high" Text="Overriding default build" />
 </Target>

只有在我添加属性BeforeTargets="Build"后,才会显示消息。

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

2 个答案:

答案 0 :(得分:8)

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

如果您使用<Project Sdk="…">使用基于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>

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

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

<Target Name="NgBuild" BeforeTargets="BeforeBuild">
  <Exec Command="ng build" />
</Target>

答案 1 :(得分:0)

似乎,您需要指定一个新目标来解决您的问题。

例如在我的.csproj中我有以下几行:

  <Target Name="TestTarget">
    <Exec Command="echo hello" />
    <Exec Command="echo goodbye" />
  </Target> 

要调用它们,我需要执行以下命令:

dotnet msbuild /t:TestTarget

在此方案中,您可以指定命令和执行顺序。希望,这会有所帮助。