.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>
我有一个 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>