构建取决于AfterBuild Microsoft.Common.targets

时间:2014-04-25 07:16:29

标签: msbuild

我正在试图弄清楚何时运行不同的目标。但是当谈到AfterBuild目标时,我有点困惑,它的评论是“在你的项目中重新定义这个目标,以便在Build之后运行任务”。但是当我看到Build依赖于什么时,我看到了:

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

这不是说这意味着Build目标在“AfterBuild”之后运行,还是我在这里错过了什么?我是Build的新手,所以也许我错过了一些微不足道的东西。

1 个答案:

答案 0 :(得分:4)

你应该在同一个文件中做一些进一步的研究(只需在文本编辑器中搜索BuildDependsOn):你会看到Build目标本身只是一个类似于存根的存根这样:

<Target
  Name="Build"
  DependsOnTargets="$(BuildDependsOn)"/>

因此,当一个人调用msbuild /t:Build时,msbuild会查找构建目标并看到它具有DependsOnTargets属性,其值为BeforeBuild;CoreBuild;AfterBuild(注意这是一个列表)。由于DependsOnTargets始终在目标本身之前执行,因此其中列出的所有目标都按所列顺序执行 first 。只有这样才能执行Build目标本身(是的,在 AfterBuild之后有效地发生)。但是Build目标本身实际上没有做任何事情:编译等都发生在CoreBuild中,所以当它被调用时,一切都已经完成。

这一开始可能看起来很奇怪,但它实际上是一种非常可扩展的方法,使目标相互依赖并定义它们运行的​​顺序。 (还有DependsOn,还有BeforeTargetsAfterTargets)因此,假设您想要一个目标,为了清晰起见,构建后有效运行,您可以使用相同的原则:

<Target Name="MyTarget" AfterTargets="Build">
  ...
</Target>

注意这实际上是首选的方法:在大型项目中,覆盖AfterBuild是不可靠的,因为你不知道其他人是否也已经这样做了,并且在多个地方覆盖它只会导致最后一个被调用