如何在发布时运行具有特定目标的MsBuild?

时间:2018-06-09 15:09:09

标签: c# visual-studio msbuild

我已经在我的csproj文件中添加了一个目标部分。

<Target Name="Spa">
  <Exec Command="ng --version" WorkingDirectory="../Spa" />
  <Exec Command="ng build --prod" WorkingDirectory="../Spa" />
  <Exec Command="del .\wwwroot\* /F /Q /S" />
  <Exec Command="copy ..\Spa\dist\Spa\* .\wwwroot" />
</Target> 

当我使用下面的命令执行它时,它正是它应该完成的。

dotnet msbuild /t:Spa

但是,如果可以在Visual Studio中执行发布之前调用目标,那就很好了( b + h + 标签 + 输入)。

我已阅读somewhere它可能,the docs声称​​ BeforePublish 是正确的目标名称。但是,当我将名称​​ Spa 更改为 BeforePublish 时,我没有获得构建和复制SPA的效果。

我缺少什么以及如何自动化流程?

1 个答案:

答案 0 :(得分:1)

  

如何在发布时使用特定目标运行MsBuild?

我在这里发布了一个答案,以确保这个问题更清楚。

对于这个问题,要注意的第一件事是它与项目类型有关。如果您要发布WPF / Winodws Forms项目,publish应该按预期工作。因为这些项目类型默认包含目标Publish,所以目标&#34; BeforePublish&#34;将按预期工作。

但是,Web项目不包含此默认目标<Target Name="BeforePublish ">,因此如果您在Web项目中使用BeforeTargets="BeforePublish",则不会按预期执行。 要解决此问题,我们可以向目标添加<Target Name="Spa" BeforeTargets="BeforePublish"> ... </Target> ,例如:

  <PropertyGroup>
    <BuildDependsOn>
      BeforeBuild;
      CoreBuild;
      AfterBuild;
      BeforePublish
    </BuildDependsOn>
  </PropertyGroup>

然后覆盖&#34;取决于&#34;属性:

AfterTargets="Build"

您可以简单地将Spa添加到目标<Target Name="Spa" AfterTargets="Build"> ... </Target> ,它应该很好:

BeforeBuild

第二件事需要注意的是,目标部分是否需要位于csproj文件的底部取决于样式csproj。正如Martin所说,如果您使用的是旧式csproj,那些目标AfterBuildMicrosoft.Common.targets实际上是在包含Visual Studio Build过程的Microsoft.Common.targets文件中预定义的,所以我们必须在csproj的底部设置我们的自定义目标,以在{{1}}文件中覆盖它。如果您使用新风格的csproj(),那么设置它并不重要。

希望这有帮助。