如何使用msbuild控制兄弟依赖目标的构建顺序?

时间:2012-08-21 17:51:57

标签: msbuild msbuild-target

在我的项目中,我有两个import语句:

<Import Project="<TransformConfigLocation>" />
<Import Project="<PackageLocation>" />

每个目标都有一个如下定义的属性组:

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        TransformConfig
    </BuildDependsOn>
</PropertyGroup>

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        Package
    </BuildDependsOn>
</PropertyGroup>

我想保证TransformConfig始终在Package之前运行。我不控制任何一个依赖目标,并且不希望明确地编辑它们,因为每次我通过NuGet更新这些目标时都会擦除这些编辑。 Package目标始终首先运行,这是不可取的。

这可能吗?

2 个答案:

答案 0 :(得分:2)

在项目中,构建订单保证遵循MSBuild target build order rules。这里没有竞争条件,一切都是序列化的。上面链接的引用:

<Target Name="Serve" DependsOnTargets="Chop;Cook" />
     

告诉MSBuild,Serve目标取决于Chop目标和   库克目标。 MSBuild运行Chop目标,然后运行Cook   目标在运行Serve目标之前。

请注意,如果在“服务”之前执行的某个其他目标将任何Chop / Cook目标作为其依赖项或已在BeforeTargets / AfterTargets中列出,则可能会影响该顺序。例如,如果您有这组目标:

 <Target Name="One" DependsOnTargets="Two;Three" />
 <Target Name="Two" DependsOnTargets="TargetB" />
 <Target Name="Three" DependsOnTargets="TargetA;TargetB;" />

并构建“One”,然后构建顺序如下:

TargetB
Two
TargetA
// skip TargetB because it was already run
Three
One

因此,在您的情况下,假设TargetB未被列为任何先前目标的依赖关系,$(BuildDependsOn)列表将在其中列出目标的顺序中执行,这将是...;TargetA;TargetB

答案 1 :(得分:0)

简单的答案是Imports 的顺序很重要。有关原因的详细信息,请参阅@Seva Titov的回答和我们的后续对话。

我强烈建议您http://amzn.com/0735645248对该主题进行全面分析。