【问题标题】:How do you control build order of sibling dependent targets with msbuild?如何使用 msbuild 控制兄弟依赖目标的构建顺序?
【发布时间】:2012-08-21 17:51:57
【问题描述】:

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

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

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

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

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

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

这可能吗?

【问题讨论】:

    标签: msbuild msbuild-target


    【解决方案1】:

    在项目中,构建顺序保证遵循 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

    【讨论】:

    • 感谢您的回复。我理解这些规则,它们很清楚。但是,我看不出您的答案如何适用于我的情况。我的项目文件有两个导入语句,并且没有为其主要目标指定 DependsOnTargets 属性。如 OP 中所述,两个导入的目标文件包含带有 BuildDependsOn 部分的目标。除了在项目文件中导入它们的顺序之外,我无法控制这些目标文件。如何保证这些目标的运行顺序?
    • 我已经用更真实的目标名称更新了 OP,希望能澄清问题。
    • @DPeden,我可能没有说清楚。您已定义或修改 $(BuildDependsOn) 属性。此属性在展开时将具有类似于"...;TransformConfig;Package" 的值。属性 $(BuildDependsOn) 可能在这样的目标中使用:。是否清楚这与我在回答中所说的有关?
    • 是的,在多玩了一会儿并参考了@Sayed Ibrahim Hashimi 的优秀书籍(参见amzn.com/0735645248 中的目标注入)之后,它基本上确实归结为 Imports 的顺序。
    • 我的回答在技术上回答了我提出的问题,因此我将其标记为这样。但是,我 +1 了你的,因为它包含有用的信息。感谢您的帮助。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多