操作项和属性的新方法 (MSBuild)
更新:2007 年 11 月
从 MSBuild 3.5 开始,可以执行下列操作:
定义一个“项定义组”来包含适用于项目中所有项的元数据。
在项组中以动态方式直接创建、删除、合并或更改属性、项和项元数据。您可以在不使用 CreateItem 任务和 CreateProperty 任务的情况下完成此操作。
项定义组
ItemDefinitionGroup 元素使您可以定义一组项定义,这些项定义默认是适用于项目中所有项的元数据值。有关更多信息,请参见项定义。
动态调整项组中的元数据
MSBuild 使用 ItemGroup 元素 (MSBuild) 和 PropertyGroup 元素 (MSBuild) 静态声明项和属性。在 MSBuild 2.0 中,当您要在生成期间创建或修改属性和项时,必须使用 CreateItem 任务或 CreateProperty 任务。此过程非常麻烦,而且不能很好地支持动态更新。但是,MSBuild 3.5 使您可以在项组中以动态方式直接创建、删除、合并或更改属性、项和项元数据。
比较下面的示例。示例 1 演示如何使用 CreateItem 任务添加任务参数和创建新项列表和元数据。示例 2 演示直接在 ItemGroup 中添加元数据的新方法。
示例 1:使用 CreateItem 任务添加任务参数的简单示例。第一个目标使用 CreateItem 任务动态创建一个称为 CultureResource 的新项列表。第二个目标为原始列表中的所有区域性资源添加称为 TargetDirectory 的新元数据。
<Target Name="GenerateBeforeCompile">
<CreateItem Include="SomeGeneratedCode.cs">
<Output TaskParameter="Include" ItemName="Compile" />
</CreateItem>
</Target>
<Target Name="ProcessCultureResources">
<CreateItem Include="@(EmbeddedResource)"
Condition="'%(Culture)' != ''"
AdditionalMetadata="TargetDirectory=%
(EmbeddedResource.Culture)">
<Output TaskParameter="Include" ItemName="CultureResource" />
</CreateItem>
</Target>
示例 2:现在通过直接在 ItemGroup 中添加参数和元数据即可实现前面的示例的结果。
<Target Name="GenerateBeforeCompile">
<ItemGroup>
<Compile Include="SomeGeneratedCode.cs" />
</ItemGroup>
</Target>
<Target Name="ProcessCultureResources">
<ItemGroup>
<CultureResource Include="@(EmbeddedResource)"
Condition="'%(EmbeddedResource.Culture)' != ''">
<TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
</CultureResource>
</ItemGroup>
</Target>
移除项
在 MSBuild 的以前版本中,若要从列表中省略项,必须创建新列表。而现在,您可以使用新的 Remove 参数直接移除项,如下所示:
<ItemGroup>
<!—Remove *.licx from the EmbeddedResource list - ->
<EmbeddedResource Remove="*.licx" />
<!—Or remove items in @(licx) from EmbeddedResource list -- >
<EmbeddedResource Remove="@(licx)" />
</ItemGroup>