MSBuild 概述

更新:2007 年 11 月

Microsoft Build Engine (MSBuild) 是 Microsoft 和 Visual Studio 的新的生成平台。MSBuild 在如何处理和生成软件方面是完全透明的,使开发人员能够在未安装 Visual Studio 的生成实验室环境中组织和生成产品。本主题简要概述了以下内容:

  • MSBuild 项目文件的基本要素。

  • 如何使用 MSBuild 生成项目。

  • MSBuild 的高级功能。

  • Visual Studio 如何使用 MSBuild 生成项目。

项目文件

MSBuild 引入了基于 XML 的新项目文件格式,这种格式简单易于理解、易于扩展,且受到 Microsoft 的完全支持。MSBuild 项目文件格式使开发人员能够完整地描述需要生成哪些项,以及如何用不同的平台和配置生成这些项。另外,项目文件的格式还使开发人员能够创作可重用的生成规则,这些规则可以分解到不同的文件中,以便可以在产品内的不同项目之间一致地执行生成。以下各节描述了 MSBuild 项目文件格式的一些基本要素。

项表示对生成系统的输入,它们根据用户为其定义的集合名称分组为项集合。这些项集合可用作任务参数,任务使用集合中包含的单个项执行生成过程的步骤。

通过创建一个元素并将项集合的名称作为 ItemGroup 元素的子元素,可以在项目文件中声明项。例如,下面的代码创建一个名为 Compile 的项集合,其中包括两个文件。

<ItemGroup>
    <Compile Include = "file1.cs"/>
    <Compile Include = "file2.cs"/>
</ItemGroup>

使用语法 @(ItemCollectionName) 在整个项目文件中引用项集合。例如,可以使用 @(Compile) 引用上面的示例中的项集合。

可以使用通配符声明项,并且对于更高级的生成方案,项可以包含其他元数据。有关项的更多信息,请参见 MSBuild 项

属性

属性表示可用于配置生成的键/值对。项和属性的不同之处包括:

  • 项存储在集合中,而属性则包含单个标量值。

  • 项无法从项集合中移除,而属性则允许在被定义后更改其值。

  • 项可以包含元数据,并且可以使用 %(ItemMetadata) 表示法,而属性不能。

通过创建元素并将属性的名称作为 PropertyGroup 元素的子元素来声明属性。例如,以下代码创建了一个值为 Build 并且名为 BuildDir 的属性。

<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

使用语法 $(PropertyName) 在整个项目文件中引用属性。例如,可使用 $(BuildDir) 引用上面的示例中的属性。有关属性的更多信息,请参见 MSBuild 属性

任务

任务是 MSBuild 项目用于执行生成操作的可执行代码的可重用单元。例如,任务可能编译输入文件或运行外部工具。而任务一旦被创建,就可以由不同项目中的不同开发人员共享和重用。

任务的执行逻辑在托管代码中编写,并使用 UsingTask 元素映射到 MSBuild。您可以通过创作一个实现 ITask 接口的托管类型来编写自己的任务。有关编写任务的更多信息,请参见如何:编写任务

MSBuild 附带了许多常用任务,如用于复制文件的 Copy、用于创建目录的 MakeDir 和用于编译 Visual C# 源代码文件的 Csc。有关可用任务和用法信息的完整列表,请参见 MSBuild 任务参考

通过创建一个元素并将任务的名称作为 Target 元素的子元素,可执行 MSBuild 项目文件中的任务。任务通常接受参数,参数作为元素的属性 (Attribute) 传递。可以使用 MSBuild 的项集合和属性 (Property) 作为参数。例如,以下代码调用 MakeDir 任务并向它传递在前面示例中声明的 BuildDir 属性的值。

<Target Name="MakeBuildDirectory">
    <MakeDir
        Directories="$(BuildDir)" />
</Target>

有关任务的更多信息,请参见 MSBuild 任务

目标

目标按特定的顺序将任务组合到一起,并将项目文件的各个部分公开为生成过程的入口点。目标通常组合为逻辑部分以允许扩展并提高可读性。通过将生成步骤拆分为许多目标,您可以从其他目标中调用生成过程的一个部分,而不必将那部分代码复制到每一个目标中。例如,如果生成过程的多个入口点需要引用以便被生成,可以创建一个生成引用的目标并从每一个必需的入口点运行此目标。

使用 Target 元素在项目文件中声明目标。例如,以下代码创建一个名为 Compile 的目标,然后此目标使用在前面的示例中声明的项集合调用 Csc 任务。

<Target Name="Compile">
    <Csc Sources="@(Compile)" />
</Target>

在更高级的方案中,目标可以描述彼此之间的关系并执行依赖性分析,如果目标是最新的,则允许跳过生成过程的整个部分。有关目标的更多信息,请参见 MSBuild 目标

使用 MSBuild 进行生成

通过使用适当的命令行选项将项目文件传递给 MSBuild.exe,从命令行运行 MSBuild。命令行选项允许您设置属性,执行特定的目标以及指定记录器。例如,使用以下命令行语法生成文件 MyProj.proj 并将 Configuration 属性设置为 Debug。

MSBuild.exe MyProj.proj /property:Configuration=Debug

有关 MSBuild 命令行选项的更多信息,请参见 MSBuild 命令行参考

安全说明:

在生成下载的项目前先确定代码的可信度。MSBuild 项目文件所执行的任务可能会破坏您的系统。

高级概念

MSBuild 可用于生成期间的更高级的操作,例如将错误、警告和消息记录到控制台或其他记录器,执行目标的依赖性分析,以批处理方式完成有关项元数据的任务和目标等。有关这些高级概念的更多信息,请参见 MSBuild 高级概念

Visual Studio 集成

Visual Studio 使用 MSBuild 项目文件格式来存储有关托管项目的生成信息。通过 Visual Studio 所添加和更改的项目设置将反映在为每个项目生成的 .*proj 文件中。Visual Studio 使用 MSBuild 的承载实例来生成托管项目,这意味着可以在 Visual Studio 中和从命令行生成托管项目(甚至可以不安装 Visual Studio),最后将得到相同的结果。有关 Visual Studio 如何使用 MSBuild 的更多信息,请参见 MSBuild 高级概念

请参见

概念

MSBuild

MSBuild 目标

MSBuild 任务

MSBuild 项

MSBuild 属性

MSBuild 批处理

MSBuild 中的日志记录概述

MSBuild 转换

Visual Studio 集成 (MSBuild)

MSBuild 项目文件架构引用

其他资源

MSBuild 参考

MSBuild 任务参考