据我所知,目前我们可以使用属性DependsOnTargets
或使用任务<CallTarget ...>
来调用目标中的其他目标
我的问题是我们应该何时使用每个案例?
答案 0 :(得分:54)
MSBuild提供了不同的方法来调用目标:
使用CallTarget
是显式方法, 你 从第一个目标开始,并按照您的顺序显式调用每个目标想。
DependsOnTargets
是隐式方法, MSBuild 通过检查目标的依赖关系来推断调用顺序。
目标可以投放的时间CallTarget
和DependsOnTargets
之间没有区别:目标在单次构建期间永远不会运行两次(除非您use MSBuild task with different property)
CallTarget
的一个限制是使用动态项和属性:您无法访问在使用CallTarget调用的另一个目标中的目标中创建的项目或属性:< / p>
<Target Name="Caller">
<CreateProperty Value="MyValue">
<OutputTaskParameter="Value" PropertyName="NewProperty"/>
</CreateProperty>
<CallTarget Targets="Called"/>
</Target>
<Target Name="Called">
<Message Text="$(NewProperty)"/>
</Target>
动态属性在创建它们的目标完成执行之前不会发布。您使用DependsOnTarget
您应该将DependsOnTargets
用于需要在目标之前执行的目标。并且CallTarget
可以在您的目标之后执行目标。这就是微软的做法。
<Target Name="CoreCompile"
DependsOnTargets="$(CoreCompileDependsOn)">
<!-- Target execution -->
<Csc ... />
...
<!-- Targets to execute after -->
<CallTarget Targets="$(TargetsTriggeredByCompilation)"/>
</Target>
答案 1 :(得分:-3)
关键区别在于DependsOnTarget 中指定的目标如果先前已执行,则不会执行。通过这种方式,多个目标可以具有相同的依赖关系,但只有第一个目标才会触发其执行(see MSDN documentation)。
您可以将其视为“确保此目标已执行,并在未执行时执行。”
CallTarget只会执行指定的目标,无论它是否先前执行过。