你应该做一些进一步的研究在同一个文件(只是在文本编辑器上BuildDependsOn
搜索):你会看到Build
目标本身只是一个存根,看起来是这样的:
<Target
Name="Build"
DependsOnTargets="$(BuildDependsOn)"/>
所以当一个人打电话给msbuild /t:Build
时,msbuild查找构建目标并且看到它有一个DependsOnTargets
属性值为BeforeBuild;CoreBuild;AfterBuild
(注意这是一个列表)。由于DependsOnTargets
始终在目标本身之前执行,因此其中列出的所有目标均按列出的顺序执行第一个。只有这样构建目标本身才会被执行(所以是的,在 AfterBuild之后实际发生了)。但是构建目标本身实际上并没有做任何事情:编译等都发生在CoreBuild中,所以在调用一切已经完成的时候。
这看起来可能很奇怪,但它实际上是一种非常可扩展的方式,使目标彼此依赖并定义它们的运行顺序。 (有DependsOn
,也BeforeTargets
和AfterTargets
)因此,假设你想,为了清楚后构建有效运行一个目标,你可以使用同样的原理:
<Target Name="MyTarget" AfterTargets="Build">
...
</Target>
注意这实际上是首选的方法:在大项目重写AfterBuild是不可靠的,因为你不知道其他人是否也已经做了它,并且在多个地方覆盖它只会导致最后一个被调用。