在我的解决方案中,一些项目有需要在最后运行的任务,比如将文件复制到不同的位置。我们使用 AfterTargets="Build"
实现这个功能:
<Target Name="CopyStuff" AfterTargets="Build">
<Copy SourceFiles="..." DestinationFolder="..." />
</Target>
If语句是有效的。但是,在构建解决方案时(而不是单个项目!),如果复制失败,我们会得到一个红色的构建警告,但msbuild(因此TFS构建)仍然成功:
> msbuild /t:clean;build my.sln
(...)
(in red...) error MSB3021: Unable to copy file (...)
> echo %errorlevel%
0 <<<<<<< This means succeeded
据我了解,这是因为 msbuild 认为只要主要的“Build”目标通过了,其他所有目标也都通过了。
我们的解决方法是将目标更改为
BeforeTargets="AfterBuild"
,这将把我的目标放入 Build 目标中。然而,这需要了解“Build”目标的内容,可能对其他项目类型无效。问题:
- 有没有办法使
AfterTargets="Build"
失败会导致解决方案构建失败? - 如果没有,有没有办法自动验证人们没有将
AfterTargets="Build"
添加到他们的项目中?