zoukankan      html  css  js  c++  java
  • 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),最后将得到相同结果。

  • 相关阅读:
    Linux下的 .o、.a、.so文件
    第三章、主机规划与磁盘分区
    debian linux中文桌面系统安装
    C++开源库,欢迎补充。
    C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)
    C# CPU,硬盘,mac地址灯本地信息查询
    打造属于自己的支持版本迭代的Asp.Net Web Api Route
    PreApplicationStartMethodAttribute的使用
    Web Api in Orchard
    Dependency Injection in ASP.NET Web API 2 Using Unity
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2390666.html
Copyright © 2011-2022 走看看