我正在试图弄清楚何时运行不同的目标。但是当谈到AfterBuild目标时,我有点困惑,它的评论是“在你的项目中重新定义这个目标,以便在Build之后运行任务”。但是当我看到Build依赖于什么时,我看到了:
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
这不是说这意味着Build目标在“AfterBuild”之后运行,还是我在这里错过了什么?我是Build的新手,所以也许我错过了一些微不足道的东西。
答案 0 :(得分:4)
你应该在同一个文件中做一些进一步的研究(只需在文本编辑器中搜索BuildDependsOn
):你会看到Build
目标本身只是一个类似于存根的存根这样:
<Target
Name="Build"
DependsOnTargets="$(BuildDependsOn)"/>
因此,当一个人调用msbuild /t:Build
时,msbuild会查找构建目标并看到它具有DependsOnTargets
属性,其值为BeforeBuild;CoreBuild;AfterBuild
(注意这是一个列表)。由于DependsOnTargets
始终在目标本身之前执行,因此其中列出的所有目标都按所列顺序执行 first 。只有这样才能执行Build目标本身(是的,在 AfterBuild之后有效地发生)。但是Build目标本身实际上没有做任何事情:编译等都发生在CoreBuild中,所以当它被调用时,一切都已经完成。
这一开始可能看起来很奇怪,但它实际上是一种非常可扩展的方法,使目标相互依赖并定义它们运行的顺序。 (还有DependsOn
,还有BeforeTargets
和AfterTargets
)因此,假设您想要一个目标,为了清晰起见,构建后有效运行,您可以使用相同的原则:
<Target Name="MyTarget" AfterTargets="Build">
...
</Target>
注意这实际上是首选的方法:在大型项目中,覆盖AfterBuild是不可靠的,因为你不知道其他人是否也已经这样做了,并且在多个地方覆盖它只会导致最后一个被调用