MSBuild 批处理

MSBuild 能够根据项元数据将项列表划分为不同的类别或批,并在每批中一次运行一个目标或任务。

任务批处理

任务批处理使您能够简化项目文件,因为它可以将项列表划分为不同的批并将各个批分别传递到任务中。这意味着项目文件只需声明任务及其特性一次,但却可以多次运行它。

通过在一个任务特性中使用 %(项元数据名称) 表示法,指定让 MSBuild 使用任务执行批处理。下面的示例根据 Color 项元数据值将 Example 项列表拆分为多个批,并将各个批分别传递给 MyTask 任务。

说明说明

如果不在任务特性中的其他位置引用项列表,或者元数据名称可能不明确,则可使用 %(项集合.项元数据名称) 表示法完全限定用于进行批处理的项元数据值。

<Project
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    
    <ItemGroup>
        <Example Include="Item1">
            <Color>Blue</Color>
        </Example>
        <Example Include="Item2">
            <Color>Red</Color>
        </Example>
    </ItemGroup>

    <Target Name="RunMyTask">
        <MyTask
            Sources = "@(Example)"
            Output = "%(Color)\MyFile.txt"/>
    </Target>

</Project>

有关更为具体的批处理示例,请参见任务批处理中的项元数据

目标批处理

MSBuild 在运行目标之前会检查该目标的输入和输出是否是最新的。如果输入和输出都是最新的,将跳过该目标。如果目标内的任务使用批处理,MSBuild 需要确定项的各个批的输入和输出是否都是最新的。否则,将在每次命中目标时执行目标。

下面的示例显示一个 Target 元素,该元素包含一个具有 %(项元数据名称) 表示法的 Outputs 特性。MSBuild 根据 Color 项元数据将 Example 项列表拆分为多个批,并分析每一批的输出文件的时间戳。如果某个批的输出不是最新的,将运行目标。否则,将跳过该目标。

<Project
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    
    <ItemGroup>
        <Example Include="Item1">
            <Color>Blue</Color>
        </Example>
        <Example Include="Item2">
            <Color>Red</Color>
        </Example>
    </ItemGroup>

    <Target Name="RunMyTask"
        Inputs="@(Example)"
        Outputs="%(Color)\MyFile.txt">
        <MyTask
            Sources = "@(Example)"
            Output = "%(Color)\MyFile.txt"/>
    </Target>

</Project>

有关目标批处理的其他示例,请参见目标批处理中的项元数据

使用元数据的属性函数

批处理可由包含元数据的属性函数控制。例如,

$([System.IO.Path]::Combine($(RootPath),%(Compile.Identity)))

使用 Combine 将根文件夹路径和 Compile 项路径组合在一起。

属性函数不能出现在元数据值中。例如,

%(Compile.FullPath.Substring(0,3))

是不允许使用的。

有关属性函数的更多信息,请参见属性函数

请参见

参考

ItemMetadata 元素 (MSBuild)

其他资源

MSBuild 概念

MSBuild 参考

MSBuild 高级概念