C# 发布时如何使用特定目标运行MsBuild?
我在csproj文件中添加了一个目标部分,如下所示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
<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>