在我的项目中,我有两个import语句:
<Import Project="<TransformConfigLocation>" />
<Import Project="<PackageLocation>" />
每个目标都有一个如下定义的属性组:
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
TransformConfig
</BuildDependsOn>
</PropertyGroup>
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
Package
</BuildDependsOn>
</PropertyGroup>
我想保证TransformConfig始终在Package之前运行。我不控制任何一个依赖目标,并且不希望明确地编辑它们,因为每次我通过NuGet更新这些目标时都会擦除这些编辑。 Package目标始终首先运行,这是不可取的。
这可能吗?
答案 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对该主题进行全面分析。