MSBuild 任务

从另一个 MSBuild 项目生成 MSBuild 项目。

参数

下表描述了 MSBuild 任务的参数。

参数 说明
BuildInParallel 可选 Boolean 参数。

如果 true,则 Projects 参数中指定的项目是并行生成的(如果可能)。 默认值为 false
Projects 必需 ITaskItem[] 参数。

指定要生成的项目文件。
Properties 可选 String 参数。

要作为全局属性应用于子项目的属性名称/值对的分号分隔列表。 指定此参数时,它的功能等效于使用 MSBuild.exe生成时设置具有 -property 开关的属性。 例如:

Properties="Configuration=Debug;Optimize=$(Optimize)"

通过 Properties 参数将属性传递给项目时,即使项目文件已加载,MSBuild 也可能创建项目的新实例。 MSBuild 为给定的项目路径和一组唯一的全局属性创建单个项目实例。 例如,此行为允许创建多个 MSBuild 任务,这些任务调用 myproject.proj ,使用 Configuration=Release,并获取 myproject.proj 的单个实例(如果未在任务中指定唯一属性)。 如果指定 MSBuild 尚未看到的属性,MSBuild 将创建项目的新实例,该实例可以与项目的其他实例并行生成。 例如,发布配置可以与调试配置同时生成。
RebaseOutputs 可选 Boolean 参数。

如果 true,则生成的项目中的目标输出项的相对路径将调整为相对于调用项目的路径。 默认值为 false
RemoveProperties 可选 String 参数。

指定要删除的全局属性集。
RunEachTargetSeparately 可选 Boolean 参数。

如果 true,MSBuild 任务将一次调用传递给 MSBuild 的列表中的每个目标,而不是同时调用。 将此参数设置为 true 保证即使以前调用的目标失败,也会调用后续目标。 否则,生成错误将停止调用所有后续目标。 默认值为 false
SkipNonexistentProjects 可选 Boolean 参数。

如果 true,则会跳过磁盘上不存在的项目文件。 否则,此类项目将导致错误。 默认为 false
SkipNonexistentTargets 可选 Boolean 参数。

如果 true,则会跳过存在但不包含命名 Targets 的项目文件。 否则,此类项目将导致错误。 默认为 false。 MSBuild 15.5 中引入。
StopOnFirstFailure 可选 Boolean 参数。

如果 true,如果其中一个项目无法生成,则不会再生成任何项目。 目前,并行生成时不支持此选项(使用多个处理器)。
TargetAndPropertyListSeparators 可选 String[] 参数。

将目标和属性的列表指定为 Project 项元数据)。 在处理之前,分隔符是未转义的。 例如,%3B(转义的“;”)被视为未转义的“;”。
TargetOutputs 可选 ITaskItem[] 只读输出参数。

返回所有项目文件中生成的目标的输出。 仅返回指定目标输出,而不是这些目标所依赖的目标上可能存在的任何输出。

TargetOutputs 参数还包含以下元数据:

- MSBuildSourceProjectFile:包含设置输出的目标的 MSBuild 项目文件。
- MSBuildSourceTargetName:设置输出的目标。 注意: 如果要单独标识每个项目文件或目标的输出,请为每个项目文件或目标单独运行 MSBuild 任务。 如果只运行一次 MSBuild 任务来生成所有项目文件,则所有目标的输出将收集到一个数组中。
Targets 可选 String 参数。

指定要在项目文件中生成的目标或目标。 使用分号分隔目标名称列表。 如果在 MSBuild 任务中未指定任何目标,则生成项目文件中指定的默认目标。 注意: 目标必须出现在所有项目文件中。 否则,将发生生成错误。
ToolsVersion 可选 String 参数。

指定在生成传递到此任务的项目时要使用的 ToolsVersion

使 MSBuild 任务能够生成面向与项目中指定版本不同的 .NET Framework 的项目。 有效值为 2.03.03.5。 默认值为 3.5

注解

除了前面列出的参数之外,此任务还从 TaskExtension 类继承参数,该类本身继承自 Task 类。 有关这些附加参数及其说明的列表,请参阅 TaskExtension 基类

与使用 Exec 任务 启动 MSBuild.exe不同,此任务使用相同的 MSBuild 进程来生成子项目。 可以跳过的已生成目标列表在父生成和子生成之间共享。 此任务也更快,因为不会创建新的 MSBuild 进程。

此任务不仅可以处理项目文件,还可以处理解决方案文件。 在 MSBuild 17.12 及更高版本中,接受 .slnx.sln 解决方案文件格式。

即使配置涉及远程基础结构(例如端口、协议、超时、重试等),MSBuild 需要执行的任何配置才能同时生成项目,但必须使用配置文件进行配置。 如果可能,配置项目应能够在 MSBuild 任务上指定为任务参数。

从 MSBuild 3.5 开始,解决方案项目现在从它生成的所有子项目中显示 TargetOutput。

将属性传递给项目

在 MSBuild 3.5 之前的 MSBuild 版本中,将不同的属性集传递给 MSBuild 项中列出的不同项目具有挑战性。 如果使用 MSBuild 任务的属性属性,则其设置将应用于正在生成的所有项目,除非对 MSBuild 任务进行批处理,并有条件地为项列表中的每个项目提供不同的属性。

但是,MSBuild 3.5 提供了两个新的保留元数据项“属性”和“AdditionalProperties”,该项提供了一种灵活的方法来传递使用 MSBuild 任务生成的不同项目的不同属性。

注释

这些新元数据项仅适用于 MSBuild 任务的 Projects 属性中传递的项。

多处理器生成优势

在多处理器系统上并行生成项目时,将发生使用此新元数据的主要好处之一。 元数据允许将所有项目合并到单个 MSBuild 任务 调用中,而无需执行任何批处理或条件 MSBuild 任务。 仅调用单个 MSBuild 任务时,Projects 属性中列出的所有项目都是并行生成的。 (但是,仅当 MSBuild 任务中存在 BuildInParallel=true 属性时。)有关详细信息,请参阅 并行生成多个项目

属性元数据

指定后,Properties 元数据将替代任务的 Properties 参数,而 AdditionalProperties 元数据追加到参数的定义中。

一种常见方案是,使用 MSBuild 任务生成多个解决方案文件,仅使用不同的生成配置。 你可能想要使用调试配置生成解决方案 a1,并使用发布配置生成解决方案 a2。 在 MSBuild 2.0 中,此项目文件如下所示:

注释

在以下示例中,“...”表示其他解决方案文件。

a.proj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build">
        <MSBuild Projects="a1.sln..." Properties="Configuration=Debug"/>
        <MSBuild Projects="a2.sln" Properties="Configuration=Release"/>
    </Target>
</Project>

但是,通过使用 Properties 元数据,可以简化此代码以使用单个 MSBuild 任务,如以下示例所示:

a.proj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectToBuild Include="a1.sln...">
            <Properties>Configuration=Debug</Properties>
        </ProjectToBuild>
        <ProjectToBuild Include="a2.sln">
            <Properties>Configuration=Release</Properties>
        </ProjectToBuild>
    </ItemGroup>
    <Target Name="Build">
        <MSBuild Projects="@(ProjectToBuild)"/>
    </Target>
</Project>

- 或 -

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectToBuild Include="a1.sln..."/>
        <ProjectToBuild Include="a2.sln">
            <Properties>Configuration=Release</Properties>
        </ProjectToBuild>
    </ItemGroup>
    <Target Name="Build">
        <MSBuild Projects="@(ProjectToBuild)"
          Properties="Configuration=Debug"/>
    </Target>
</Project>

AdditionalProperties 元数据

请考虑以下方案:使用 MSBuild 任务生成两个解决方案文件,这两种方案均使用发布配置,另一个使用 x86 体系结构,另一个使用 ia64 体系结构。 在 MSBuild 2.0 中,需要创建 MSBuild 任务的多个实例:一个是使用发布配置和 x86 体系结构生成项目,另一个实例使用 ia64 体系结构的发布配置。 项目文件如下所示:

a.proj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build">
        <MSBuild Projects="a1.sln..." Properties="Configuration=Release;
          Architecture=x86"/>
        <MSBuild Projects="a2.sln" Properties="Configuration=Release;
          Architecture=ia64"/>
    </Target>
</Project>

通过使用 AdditionalProperties 元数据,可以使用以下命令简化此作,以使用单个 MSBuild 任务

a.proj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectToBuild Include="a1.sln...">
            <AdditionalProperties>Architecture=x86
              </AdditionalProperties>
        </ProjectToBuild>
        <ProjectToBuild Include="a2.sln">
            <AdditionalProperties>Architecture=ia64
              </AdditionalProperties>
        </ProjectToBuild>
    </ItemGroup>
    <Target Name="Build">
        <MSBuild Projects="@(ProjectToBuild)"
          Properties="Configuration=Release"/>
    </Target>
</Project>

示例

以下示例使用 MSBuild 任务生成由 ProjectReferences 项集合指定的项目。 生成的目标输出存储在 AssembliesBuiltByChildProjects 项集合中。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <ProjectReferences Include="*.*proj" />
    </ItemGroup>

    <Target Name="BuildOtherProjects">
        <MSBuild
            Projects="@(ProjectReferences)"
            Targets="Build">
            <Output
                TaskParameter="TargetOutputs"
                ItemName="AssembliesBuiltByChildProjects" />
        </MSBuild>
    </Target>

</Project>

另请参阅