MSBuild是否有OnImport回调或类似的东西来检测导入?

时间:2014-07-31 11:18:23

标签: msbuild

标题中的意图听起来更复杂,因为它是

我有一个看起来像这样的脚本:

<Import Project="MSBuild/Backend.msbuild.xml" />

<PropertyGroup>
        <Data>SomeData</Data>
</PropertyGroup>

我只是想检测Import语句是在PropertyGroup之前还是之后,因为后端脚本看起来像

<PropertyGroup>
        <BasedOnData>$(Data)/magic.exe</BasedOnData>
</PropertyGroup>

如果Import语句首先出现,BasedOnData只是看起来像/magic.exe这是错误的。如果Import到最后,一切都很好。

我尝试在Data中检查目标中的Backend属性,但已定义目标呼叫时间Data。 导致

Data=SomeData

但是

BasedOnData=/magic.exe

我可以根据Error创建$(BasedOnData)== '/magic.exe'条件,但这很容易出错,因为它依赖于DataBasedOnData的值。

Error中设置PropertyGroup条件不起作用。

这个已知的任何更聪明的解决方案?

我应该在第一个目标中回退到CreateProperty,这样我就不知道Import声明的位置了吗? (这比普通的PropertyGroup更加冗长,并且不容易阅读。)

1 个答案:

答案 0 :(得分:2)

在评估属性组中的所有属性之后,在单独的传递中执行MSBuild目标。所以你观察的是设计行为。

要在您的案例中进行导入订单检查,以下操作应该可以解决问题。在Backend.msbuild.xml文件中添加以下内容:

    <PropertyGroup>
        <Data_Copy>$(Data)</Data_Copy>
    </PropertyGroup>

这只是复制了当时的$(Data)值。然后在相同的导入文件或任何其他目标中添加此<Error>任务:

    <Error Text="Import has to be specified after `Data` is defined" Condition="'$(Data_Copy)' == ''" />

如果在定义$(Data)之前导入Backend.msbuild.xml,这将破坏构建。