Target 元素 (MSBuild)

包含一组要连续执行的 MSBuild 任务。

<Project><Target>

语法

<Target Name="Target Name"
        Inputs="Inputs"
        Outputs="Outputs"
        Returns="Returns"
        KeepDuplicateOutputs="true/false"
        BeforeTargets="Targets"
        AfterTargets="Targets"
        DependsOnTargets="DependentTarget"
        Condition="'String A' == 'String B'"
        Label="Label">
    <Task>... </Task>
    <PropertyGroup>... </PropertyGroup>
    <ItemGroup>... </ItemGroup>
    <OnError... />
</Target>

特性和元素

下列各节描述了特性、子元素和父元素。

特性

属性 描述
Name 必需的特性。

目标的名称。 目标名称可以包含除 $@()%*?. 之外的任何字符。
Condition 可选特性。

要评估的条件。 如果该条件评估结果为 false,那么目标不会执行目标主体或任何在 DependsOnTargets 属性中设置的目标。 有关条件的详细信息,请参阅条件
Inputs 可选特性。

形成此目标输入的文件。 采用分号分隔多个文件。 将会比较该文件的时间戳与 Outputs 中文件的时间戳,从而确定 Target 是否为最新。 有关详细信息,请参阅增量生成如何:增量生成以及转换
Outputs 可选特性。

形成此目标输出的文件。 采用分号分隔多个文件。 将会比较该文件的时间戳与 Inputs 中文件的时间戳,从而确定 Target 是否为最新。 有关详细信息,请参阅增量生成如何:增量生成以及转换
Returns 可选特性。

一组可供调用此目标(例如,MSBuild 任务)的任务使用的项。 采用分号分隔多个目标。 如果该文件中的目标没有 Returns 属性,则会使用输出属性来实现此目的。
KeepDuplicateOutputs 可选布尔属性。

如果为 true,则会记录对目标的“返回”中的同一项的多个引用。 默认情况下,此属性为 false
BeforeTargets 可选特性。

分号分隔的目标名称列表。 指定时,表示此目标应在指定的一个或多个目标之前运行。 这样项目作者就可以扩展现有的一组目标,而无需直接对其进行修改。 有关详细信息,请参阅目标生成顺序
AfterTargets 可选特性。

分号分隔的目标名称列表。 指定时,表示此目标应在指定的一个或多个目标之后运行。 这样项目作者就可以扩展现有的一组目标,而无需直接对其进行修改。 有关详细信息,请参阅目标生成顺序
DependsOnTargets 可选特性。

必须先执行该目标,才能执行此目标或开始顶级依赖关系分析。 采用分号分隔多个目标。
Label 可选特性。

可标识系统和用户元素或对其进行排序的标识符。

子元素

元素 描述
Task 创建并执行的 MSBuild 任务的实例。 目标中可能有零个或零个以上的任务。
PropertyGroup 包含一组用户定义的 Property 元素。 自 .NET Framework 3.5 起,Target 元素可能包含 PropertyGroup 元素。
ItemGroup 包含一组用户定义的 Item 元素。 自 .NET Framework 3.5 起,Target 元素可能包含 ItemGroup 元素。 有关详细信息,请参阅
OnError 对于失败的任务,如果 ContinueOnError 属性为 ErrorAndStop(或 false),则会出现一个或多个要执行的任务。 目标中可能有零个或零个以上的 OnError 元素。 如果存在 OnError 元素,则其必须为 Target 元素中最后的元素。

有关 ContinueOnError 属性的详细信息,请参阅 Task 元素 (MSBuild)

父元素

元素 描述
Project MSBuild 项目文件必需的根元素。

备注

在运行时指定第一个要执行的目标。 目标可依赖于其他目标。 例如,部署的目标依赖于编译的目标。 MSBuild 引擎按依赖关系在 DependsOnTargets 属性中出现的顺序从左到右依次执行依赖关系。 有关详细信息,请参阅目标

MSBuild 依赖于导入顺序,带有特定 Name 属性的目标的最后一个定义是使用的定义。

即使一个目标与多个目标存在依赖关系,在生成过程中该目标也只执行一次。

如果因为目标 Condition 属性的评估结果为 false 而跳过了该目标,那么稍后在生成中调用该目标时,仍可执行该目标且此时其 Condition 属性评估结果为 true

在 MSBuild 4 之前,Target 会返回 Outputs 属性中指定的所有项。 为实现此目的,MSBuild 就必须记录这些项,以防稍后生成中的任务会需要这些项。 由于无法表明哪些目标含有调用方请求的输出,因此 MSBuild 将所有调用的 Target 上所有 Outputs 的所有项汇集到了一起。 这为含有大量输出项的生成带来了缩放问题。

如果用户在项目中的任何 Target 元素上指定 Returns,则只有含有 Returns 属性的那些 Target 会记录这些项。

Target 可能包含 Outputs 属性和 Returns 属性。 OutputsInputs 一起确定目标是否为最新目标。 如果存在 Returns,则替代 Outputs 的值,从而确定要返回给调用方的项。 如果不存在 Returns,则提供 Outputs 供调用方使用,但之前描述的情况除外。

在 MSBuild 4 之前,只要 TargetOutputs 中包含对同一项的多个引用,就会记录这些副本项。 在含有许多输出和许多项目相互依赖项的各种大型生成中,这会浪费大量的内存,因为副本项没有任何用处。 将 KeepDuplicateOutputs 属性设置为 true 时,就会记录这些副本。

示例

以下代码示例演示执行 Csc 任务的 Target 元素。

<Target Name="Compile" DependsOnTargets="Resources" Returns="$(TargetPath)">
    <Csc Sources="@(CSFile)"
          TargetType="library"
          Resources="@(CompiledResources)"
          EmitDebugInformation="$(includeDebugInformation)"
          References="@(Reference)"
          DebugType="$(debuggingType)" >
        <Output TaskParameter="OutputAssembly"
                  ItemName="FinalAssemblyName" />
    </Csc>
</Target>

请参阅