标题中的意图听起来更复杂,因为它是
我有一个看起来像这样的脚本:
<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'
条件,但这很容易出错,因为它依赖于Data
和BasedOnData
的值。
在Error
中设置PropertyGroup
条件不起作用。
这个已知的任何更聪明的解决方案?
我应该在第一个目标中回退到CreateProperty
,这样我就不知道Import
声明的位置了吗? (这比普通的PropertyGroup
更加冗长,并且不容易阅读。)
答案 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,这将破坏构建。