今天要花时间学学MSBuild,学习的资料是博客园上的一些关于MSBuild的文章和MSDN上对MSBuild的介绍。
MSBuild简介:
MSDN上这样描述的:Microsoft Build Engine(MSBuild)是Microsoft和Visual Studio的新的生成平台。我的理解是:MSBuild是一个工具,它生成了一个项目文件(本质上是XML)。这个项目文件使得开发人员能够描述哪些项需要生成,以及如何利用不用的平台和配置生成这些项。
接下来,我在Visual Studio 2008中创建了一个Console Application,只是在控制台里输出一行“Hello World!”。然后在这个项目里,用记事本方式打开MSBuildTest.csproj,有以下代码
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{948EB309-A70D-4627-B7DA-FC99911401CE}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MSBuildTest</RootNamespace>
<AssemblyName>MSBuildTest</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
这个项目文件里面就有着项目文件的一些基本要素。
项
项表示对生成系统的输入,它们根据用户为其定义的集合名称分组为项集合。这些项集合可用做任务参数,任务使用集合中包含的单个项执行生成过程的步骤。
通过创建一个元素并将其项集合的名称作为ItemGroup元素的子元素,可以在项目文件中声明项。可以看到上面的项目文件中有这样一个名为Compile的项集合,其中包含两个文件。
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
通过语法 @(ItemCollectionName)在整个项目文件中引用项集合。例如,可以用@(Compile)引用到上面的项集合。
属性
属性表示可用于配置生成的键/值对。通过创建元素并将属性的名称作为PropertyGroup元素的子元素来声明属性。在上面的项目文件中,就创建了值为9.0.21022并且名为ProductVersion的属性…
通过使用语法$(PropertyName)在整个项目文件中引用属性。例如,可以使用$(ProductVersion)引用上面说到的属性。
任务
任务是MSBuild项目用于执行生成操作的可执行代码的可重用单元。任务可能编译输入文件或运行外部工具,而任务一旦被创建,就可以由不同项目中的不同开发人员共享和重用。
通过创建一个元素并将任务的名称作为Target元素的子元素,可执行MSBuild项目文件中的任务。任务通常接收参数,参数作为元素的属性传递。可以使用MSBuild的项集合和属性作为参数。例如,以下代码调用MakeDir任务并向它传递一个BuildDir属性的值。
<Target Name="MakeBuildDirectory">
<MakeDir Directories="$(BuildDir)" />
</Target>
目标
目标按特定的顺序将任务组合到一起,并将项目文件的各个部分公开为过程的入口点。目标通常组合为逻辑部分以允许扩展并提高可读性。通过将生成步骤拆分为许多目标,您可以从其他目标中调用生成过程的一个部分,而不必将那部分代码复制到每一个目标中。例如,如果生成过程的多个入口点需要引用以便被生成,可以创建一个生成引用的目标并从每个必需的入口点运行此目标。
使用 Target 元素在项目文件中声明目标。例如,以下代码创建一个名为 Compile 的目标,然后此目标使用在前面的示例中声明的项集合调用 Csc 任务。
<Target Name="Compile">
<Csc Sources="@(Compile)" />
</Target>
Visual Studio 集成
Visual Studio 2005 使用 MSBuild 项目文件格式来存储托管项目的生成信息。通过 Visual Studio 所添加和更改的项目设置将反映在为每个项目生成的 .*proj 文件中。Visual Studio 使用 MSBuild 的承载实例来生成托管项目,这意味着可以在 Visual Studio 中和从命令行生成托管项目(甚至可以不安装 Visual Studio),最后将得到相同结果。