MSBuild 目标
目标以特定的顺序将任务组合到一起,并允许生成过程分解为较小的单位。 例如,一个目标可能会删除输出目录中的所有文件以准备进行生成,而另一个目标可能会编译项目的输入并将它们放到该空目录中。 有关任务的更多信息,请参见 MSBuild 任务。
在项目文件中声明目标
目标是使用 Target 元素在项目文件中声明的。 例如,下面的 XML 创建一个名为 Construct 的目标,然后,该目标对 Compile 项类型调用 Csc 任务。
<Target Name="Construct">
<Csc Sources="@(Compile)" />
</Target>
像 MSBuild 属性一样,目标可以重新定义。 例如,
<Target Name="AfterBuild" >
<Message Text="First occurrence" />
</Target>
<Target Name="AfterBuild" >
<Message Text="Second occurrence" />
</Target>
如果 AfterBuild 执行,则仅显示“第二次出现”。
目标生成顺序
如果一个目标的输入取决于另一个目标的输出,则必须对目标进行排序。 可以通过多种方法指定目标的运行顺序。
初始目标
默认目标
第一个目标
目标依赖项
BeforeTargets 和 AfterTargets (MSBuild 4.0)
目标决不会在一个生成过程中运行两次,即便生成中后面的目标依赖于它也是如此。 目标运行之后,它对生成的作用亦即完成。
有关目标生成顺序的详细信息和更多信息,请参见目标生成顺序。
目标批处理
目标元素可能具有 Outputs 特性,该特性指定 %(元数据) 形式的元数据。 如果是这样,MSBuild 将针对每个唯一元数据值运行一次目标,并对具有该元数据值的项进行分组或“批处理”。 例如,
<ItemGroup>
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="Microsoft.CSharp">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
</ItemGroup>
<Target Name="AfterBuild"
Outputs="%(Reference.RequiredTargetFramework)">
<Message Text="Reference:
@(Reference->'%(RequiredTargetFramework)')" />
</Target>
按 Reference 项的 RequiredTargetFramework 元数据对 Reference 项进行批处理。 目标的输出如下所示:
Reference: 3.5;3.5
Reference: 4.0
实际生成中很少使用目标批处理。 任务批处理更为常见。 有关更多信息,请参见 MSBuild 批处理。
增量生成
增量生成已经过优化,这样,如果目标所具有的输出文件相对于其对应的输入文件而言是最新的,则该目标不会执行。 目标元素既可以具有 Inputs 特性(指明目标预计作为输入的项),也可以具有 Outputs 特性(指明目标作为输出所生成的项)。
如果所有输出项都是最新的,则 MSBuild 将跳过目标,这可以显著加快生成速度。 这称为目标的增量生成。 如果只有部分文件为最新,则 MSBuild 将执行目标,但会跳过最新的项。 这称为目标的部分增量生成。 有关更多信息,请参见增量生成。