Msbuild ';依赖于目标';和';后目标';?
Msbuild ';依赖于目标';和';后目标';?,msbuild,Msbuild,DependsOnTargets和postertargets之间有什么区别? 我无法区分这两者。DependsOnTarget 假设您有两项任务: 建设项目 复制所有内容 您可以通过执行任务2开始构建,然后在任务声明中定义其依赖项。因此,如果定义任务2依赖于任务1,则构建过程将启动并执行任务1,然后执行任务2 后目标 更简单:它只意味着在其他目标之后执行的任务。以上面的例子为例,在任务1之后,构建项目执行任务2 我希望这有助于 定义在执行目标之前必须执行的目标 <Target Name="
DependsOnTargets
和postertargets
之间有什么区别?
我无法区分这两者。DependsOnTarget
假设您有两项任务:
后目标
更简单:它只意味着在其他目标之后执行的任务。以上面的例子为例,在任务1之后,构建项目执行任务2
我希望这有助于
定义在执行目标之前必须执行的目标
<Target Name="DependsOn" DependsOnTargets="DependencyTarget1;DependencyTarget2">
<Message Text="Target : DependsOn"/>
</Target>
<Target Name="DependencyTarget2">
<Message Text="Target : DependencyTarget2"/>
</Target>
<Target Name="DependencyTarget1">
<Message Text="Target : DependencyTarget1"/>
</Target>
Output
> Target : DependencyTarget1
> Target : DependencyTarget2
> Target : DependsOn
- 我认为答案要简单得多。
DependsOnTargets
和postertargets
的效果基本相同。在目标前<代码>和目标后<代码>的原因(来自Microsoft文档):
这使项目作者可以扩展现有的一组目标,而无需
直接修改它们
因此,如果您有一个现有的目标B,并且您想添加一个必须首先执行的新目标a,那么您有两个选择:
DependsOnTargets=“A”
BeforeTargets=“B”
如果您不能修改B(例如,它是一个现有的Microsoft目标),那么此时您需要在目标之前进行
,而之前提供的其他答案是正确的,我认为他们没有提到我认为的后目标
优于依赖目标
的主要好处
DependsOnTargets
从MSBuild开始就存在。DependsOnTargets
的问题在于,它需要目标作者明确允许扩展性。这是通过定义一个用作DependsOnTargets
值的属性来实现的,如下所示:
<PropertyGroup>
<SomeTargetDependsOnTargets>
Dependency1;Dependency2
</SomeTargetDependsOnTargets>
</PropertyGroup>
<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
...
</Target>
<SomeTargetDependsOnTargets>
$(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>
这种设计的问题在于,如果作者只是内联了Dependency1;Dependency2
没有办法将其提取到属性中,而是从外部修改它以允许自定义
另一方面,postertargets
不要求原始目标作者将DependsOnTargets
值显式提取到属性中以允许扩展性。更简洁地说:
表示:
如果要运行x
,y
必须先运行
表示:
如果某个东西运行
b
,那么在它之后运行a
。主要有两个区别:
- 第一:dependsOnTargets属性中指定的目标是 在后目标之前执行
- 第二:如果在后目标属性中指定的一个目标被执行 这个目标也会在之后执行(我指的是目标 其中指定了“后目标”属性),但对于 那些在dependson中的目标
BeforeTargets
和BeforeTargets
在不考虑条件的情况下运行,而当条件评估为false时,则跳过DependsOnTargets
(和目标本身)”
我认为你的执行顺序错了;应该是postertargets->The target->BeforeTargets
。我不明白为什么这个答案是最高评分的。它不能解释后目标和依赖目标之间的行为差异。史蒂夫·罗宾斯在评论你的第二句话时说:“不,它们不一样。”。有一个奇怪的扭曲,每个人都没有提到:考虑建立目标A,如在代码> MSBudio/t:一个< /代码>。当使用DependsOnTargets
属性指定依赖项时,以这种方式调用msbuild不会生成目标B。但是,当使用postertargets
属性指定依赖项时,以这种方式调用msbuild会生成目标B。@aprelev:好的,很公平。在我的辩护中:我确实说过“基本上”:-)我只考虑依赖链,假设初始目标是“B”或依赖它的东西。谢谢你指出这个微妙之处。谢谢@aprelev,你的评论是我在整个页面中找到的唯一有用的东西。非常感谢。我认为你的回答正确地回答了这个问题。不知道为什么这些意思的解释被标记为答案。无论如何,你的回答确实帮助我理解了其中的区别。谢谢
<Target Name="MainTarget" DependsOnTargets="DefaultDependsOn">
<Message Text="Target : MainTarget"/>
</Target>
<Target Name="DefaultDependsOn">
<Message Text="Target : DefaultDependsOn"/>
</Target>
<Target Name="DefaultBeforeTarget" BeforeTargets="MainTarget">
<Message Text="Target : DefaultBeforeTarget"/>
</Target>
<Target Name="DefaultAfterTarget" AfterTargets="MainTarget">
<Message Text="Target : DefaultAfterTarget"/>
</Target>
Output
> Target : DefaultDependsOn
> Target : DefaultBeforeTarget
> Target : MainTarget
> Target : DefaultAfterTarget
<PropertyGroup>
<SomeTargetDependsOnTargets>
Dependency1;Dependency2
</SomeTargetDependsOnTargets>
</PropertyGroup>
<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
...
</Target>
<SomeTargetDependsOnTargets>
$(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>
<Target Name="FirstTarget" AfterTargets="PostBuildEvent" Condition="'False'">
<Message Text="This target is never executed" />
</Target>
<Target Name="SecondTarget" AfterTargets="FirstTarget">
<Message Text="SecondTarget is executed" />
</Target>
<Target Name="FirstTarget" AfterTargets="PostBuildEvent" Condition="'False'">
<Message Text="This target is never executed" />
</Target>
<Target Name="SecondTarget" DependsOnTargets="FirstTarget">
<Message Text="SecondTarget is executed" />
</Target>