0

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

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

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

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

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

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

这可能吗?

4

2 回答 2

2

在项目中,构建顺序保证遵循 MSBuild目标构建顺序规则。这里没有竞争条件,一切都是序列化的。来自上面链接的引用:

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

告诉 MSBuild Serve 目标取决于 Chop 目标和 Cook 目标。MSBuild 运行 Chop 目标,然后运行 ​​Cook 目标,然后再运行 Serve 目标。

请注意,如果在“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) list 将按照目标在此处列出的顺序执行,即 ...;TargetA;TargetB.

于 2012-08-22T15:50:09.613 回答
0

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

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

于 2012-08-22T19:19:58.817 回答