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

C# 发布时如何使用特定目标运行MsBuild?,c#,visual-studio,msbuild,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

我在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> 
但是,如果可以在VisualStudio中执行发布之前调用目标(b+h+Tab+Enter),那就太好了

我已经读到这是可能的,并声称BeforePublish是正确的目标名称。然而,当我将Spa的名称更改为BeforePublish时,我并没有得到Spa被构建和复制的效果

我遗漏了什么?如何使流程自动化

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

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

对于这个问题,首先要注意的是它与项目类型有关。如果要发布WPF/Winodws表单项目,
应按预期工作。因为这些项目类型默认包括目标
publish
,所以目标“BeforePublish”将按预期工作

但是,web项目不包含此默认目标
Publish
,因此如果在web项目中使用
,它将不会按预期执行要解决此问题,我们可以向目标添加一个
BeforeTargets=“BeforePublish”
,如:

<Target Name="Spa" BeforeTargets="BeforePublish">
   ...
</Target>
需要注意的第二件事是,目标节是否需要位于csproj文件的底部取决于csproj的样式。正如Martin所说,如果您使用的是旧式的csproj,那么那些目标
在构建之前
在构建之后
实际上是在包含Visual Studio构建过程的
Microsoft.Common.targets
文件中预定义的,因此,我们必须在csproj的底部设置自定义目标,以便在
Microsoft.Common.targets
文件中覆盖它。如果您使用的是新样式csproj(),则将其设置在何处并不重要


希望这有帮助。

也许可以尝试向目标添加BeforeTargets=“BeforePublish”?或者在项目文件中添加DefaultTargets=“Build,Spa”?快速检查,确保在csproj的底部定义了发布前目标。@MichaelBaker我没有想到顺序(事实上我在某个地方读到它没有什么意义),但碰巧它已经在底部了。好提示。遗憾的是,它已经生效了。有更多想法吗?@pinkfloydx33只是为了让我不会在困惑中迷失-你介意发布一个你的意思的快速示例吗?我有点不清楚DefaultTargets应该去哪里。作为目标部分的属性?(我想,BeforeTargets是上述标记中的一个属性,所以我会马上测试。)@pinkfloydx33,顺便说一句,这没关系。我在之前添加了目标,现在它起作用了。必须是VS 2017的一个变化。根据上一版本的文档,按步骤命名目标,并以其为依托。显然,现在需要明确指定它,而名称并不重要。请将您的评论作为回复,以便我可以接受它作为回答。确保添加Michael关于目标部分在文件中的位置的评论(在底部,他说)。此外,您可能希望添加有关旧版本的备注。
<Target Name="Spa" BeforeTargets="BeforePublish">
   ...
</Target>
  <PropertyGroup>
    <BuildDependsOn>
      BeforeBuild;
      CoreBuild;
      AfterBuild;
      BeforePublish
    </BuildDependsOn>
  </PropertyGroup>
<Target Name="Spa" AfterTargets="Build">
   ...
</Target>