相关疑难解决方法(0)

在VS2012中,BeforeBuild和其他目标发生了什么变化?

我正在尝试在Visual Studio 2012中的C++项目中使用一些预构建步骤,但它们不会被调用(虽然我很确定Visual Studio 2010中的相同技术是正常的).命令行构建表现完全相同.

这是项目文件的结尾; 该文件是使用Visual Studio生成的,然后我刚刚添加了最后几行:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="BeforeBuild">
  <Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile">
  <Message Text="### BeforeCompile ###" />
</Target>
<Target Name="AfterBuild">
  <Message Text="### AfterBuild ###" />
</Target>
Run Code Online (Sandbox Code Playgroud)

这是输出:

Project "d:\temp\temp.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
  Creating "Debug\temp.unsuccessfulbuild" because "AlwaysCreate" was specified.
AfterBuild:
  AfterBuild
FinalizeBuildStatus:
  Deleting file "Debug\temp.unsuccessfulbuild".
  Touching "Debug\temp.lastbuildstate".
Run Code Online (Sandbox Code Playgroud)

所以只考虑AfterBuild而忽略其他的.看看这个我在Microsoft.BuildSteps.targets中找到了这个PropertyGroup:

<BuildDependsOn>
  _PrepareForBuild;
  $(BuildSteps);
  AfterBuild;
  FinalizeBuildStatus;
</BuildDependsOn>
Run Code Online (Sandbox Code Playgroud)

难道这不也有BeforeBuild和BuildEvent目标吗?或者我的MSBuild安装有什么问题导致它使用此BuildSteps.targets文件而不是其他东西?

正如Alexey指出的那样,使用Before/AfterTarget提供了一个可用的解决方法.您只需要处理要使用的目标,但通过查看BuildSteps文件可以轻松实现.这似乎现在工作正常:

<Target Name="BeforeBuild" BeforeTargets="PrepareForBuild">
  <Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile" BeforeTargets="BuildCompile"> …
Run Code Online (Sandbox Code Playgroud)

msbuild visual-studio-2012

16
推荐指数
1
解决办法
8781
查看次数

AfterTargets失败不会使msbuild运行失败

在我的解决方案中,某些项目具有需要在最后运行的任务,例如将文件复制到各个位置.我们用以下方法实现AfterTargets="Build":

<Target Name="CopyStuff" AfterTargets="Build">
    <Copy SourceFiles="..." DestinationFolder="..." />
</Target>
Run Code Online (Sandbox Code Playgroud)

如果有效.但是,在构建解决方案(而不是单个项目!)时,如果复制失败,我们会收到红色构建警告,但msbuild(因此TFS构建)成功:

> msbuild /t:clean;build my.sln
(...)
(in red...) error MSB3021: Unable to copy file (...)

> echo %errorlevel%
0     <<<<<<< This means succeeded
Run Code Online (Sandbox Code Playgroud)

据我所知,这是因为msbuild认为只要主要的"Build"目标通过,一切都会过去.

我们的解决方法 - BeforeTargets="AfterBuild"将目标更改为,将目标置于Build目标中.但是,这需要了解"构建"目标的内容,并且可能不适用于其他项目类型.

题:

  1. 有没有办法让AfterTargets="Build"失败的解决方案构建失败?
  2. 如果没有,有没有办法自动验证人们没有添加AfterTargets="Build"到他们的项目中?

msbuild

6
推荐指数
1
解决办法
483
查看次数

标签 统计

msbuild ×2

visual-studio-2012 ×1