我有一个有角度的项目,我想把它包含在我的Visual解决方案中。我添加了一个新项目,类型为ASP.NET Core 2/空,它包含所有文件,不包括node_modules和类似的文件,直接在csproj中使用通配符。
我遇到的问题是覆盖默认的构建目标--当生成目标被触发时,我想将其称为"ng build",但这并没有发生。有关这方面的一些材料可以找到这里和这里。
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文件。
发布于 2017-12-03 15:14:11
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>发布于 2017-11-09 06:08:44
似乎,您需要指定一个新的目标来解决您的问题。
例如,在我的.csproj中,我有以下几行:
<Target Name="TestTarget">
<Exec Command="echo hello" />
<Exec Command="echo goodbye" />
</Target> 要调用它们,我需要执行以下命令:
dotnet msbuild /t:TestTarget在这个场景中,您可以指定命令和执行顺序。希望这个会有帮助的。
https://stackoverflow.com/questions/47179705
复制相似问题