说明评估顺序的示例
MSBuild 在 Target
元素之前评估 PropertyGroup
,Choose
和 ItemGroup
元素,这些元素直接位于 Project
元素之下。
- 直接在
Project
元素下,PropertyGroup
和Choose
元素按照它们出现的顺序进行评估,然后按照它们出现的顺序评估ItemGroup
元素。 - 在
Target
元素中,PropertyGroup
和ItemGroup
具有相同的优先级,并按照它们出现的顺序进行评估。
在通过 Import
引用的文件中,MSBuild 以与上面相同的方式评估 PropertyGroup
,Choose
和 ItemGroup
,并且好像导入文件的内容出现在 Import
所在的内联中。
下面的注释提供了 MSBuild 评估选定行之前和之后的属性值和项目计数。
<Project DefaultTargets="FooTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="FooTarget">
<ItemGroup>
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '1' -->
<FooItem Include="foo value B" />
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '2' -->
</ItemGroup>
<PropertyGroup>
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '2' -->
<FooProp>3</FooProp>
<!-- '$(FooProp)' == '3', '@(FooItem->Count())' == '2' -->
</PropertyGroup>
</Target>
<ItemGroup>
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '0' -->
<FooItem Include="foo value A" />
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '1' -->
</ItemGroup>
<PropertyGroup>
<!-- '$(FooProp)' == '', '@(FooItem->Count())' == '0' -->
<FooProp>1</FooProp>
<!-- '$(FooProp)' == '1', '@(FooItem->Count())' == '0' -->
</PropertyGroup>
<Choose>
<When Condition=" '$(FooProp)' == '1' ">
<!-- '$(FooProp)' == '1', '@(FooItem->Count())' == '0' -->
<FooProp>2</FooProp>
<!-- '$(FooProp)' == '2', '@(FooItem->Count())' == '0' -->
</When>
</Choose>
</Project>