我有一个我想在Visual Studio解决方案中包含的角度项目。我添加了一个类型为ASP.NET Core 2 / Empty的新项目,其中包含所有文件,不包括node_modules和类似的文件,直接通过csproj中的通配符。
我遇到的问题是覆盖默认构建目标 - 当触发构建目标时,我想调用“ng build”,但这不会发生。有关此问题的一些材料可以在here和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文件。
答案 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
在此方案中,您可以指定命令和执行顺序。希望,这会有所帮助。