2014-04-25 28 views
1

我试图找出不同的目标运行时间。但是对于AfterBuild目标,我有点困惑,它的评论是“在你的项目中重新定义这个目标,以便在Build之后运行任务”。但是,当我再看一下生成取决于我看到:构建取决于AfterBuild Microsoft.Common.targets

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

该做什么这是不是意味着构建目标“AfterBuild”后运行还是我失去了一些东西?我是Build的新手,所以也许我错过了一些微不足道的东西。

回答

4

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

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

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

这看起来可能很奇怪,但它实际上是一种非常可扩展的方式,使目标彼此依赖并定义它们的运行顺序。 (有DependsOn,也BeforeTargetsAfterTargets)因此,假设你想,为了清楚后构建有效运行一个目标,你可以使用同样的原理:

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

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