MSBuild入门

今天要花时间学学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),最后将得到相同结果。

原文地址:https://www.cnblogs.com/zhangchenliang/p/2390666.html