操作项和属性的新方法 (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>

请参见

概念

MSBuild 项目文件架构引用

其他资源

MSBuild 概念