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

.NET Core - override default build targets

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

我遇到的问题是覆盖默认构建目标 - 当构建目标被触发时,我想调用 "ng build",但这并没有发生。可以找到关于这方面的一些资料 here and here

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 文件。

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

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

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

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

dotnet msbuild /t:TestTarget

在这种情况下,您可以指定命令和执行顺序。希望,这会有所帮助。

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>