zoukankan      html  css  js  c++  java
  • 作为.Net程序员的你,竟然不知道MSBuild是什么?

    其实说来惭愧,在几天之前,其实自己也不知道MSBuild是什么,只是自己在玩Jenkins的时候才知道了MSBuild,下面言归正传,记录下自己的学习内容。

    什么是MSBuild?

    MSBuild是Microsoft Build Engine的缩写,其是一个应用构建平台。我们在VS中使用“生成解决方案”的背后就是依赖MSBuild来实现,但我们完全可以在cmd中使用MSBuild来完成应用的构建。

     

    在我们的解决方案中,有一个后缀为csproj的文件。该文件定义了使用什么及如何生成我们的解决方案,下面我们将分别介绍csproj中的基本元素。

    Property

    Property以name/value的方式来进行定义,其中主要声明了解决方案生成过程所需要的参数,可以$(“name”)的方式进行访问。如下xml中Platform表示应用的目标平台为AnyCPU,我们可以直接更改该文件,也可以通过VS界面修改该值。

    <PropertyGroup>
    
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    
        <ProjectGuid>{12F320FB-647E-4BAB-9E15-D2F164A0896B}</ProjectGuid>
    
        <OutputType>Exe</OutputType>
    
        <AppDesignerFolder>Properties</AppDesignerFolder>
    
        <RootNamespace>BuildTest1</RootNamespace>
    
        <AssemblyName>BuildTest1</AssemblyName>
    
        <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    
        <FileAlignment>512</FileAlignment>
    
      </PropertyGroup>

    Item

    Item用来标识项目的引用资源及源代码文件,其格式为<Item Type="TheType" Include="NameOrPath" />,通过@(TypeName)的方式来进行访问。如下Reference标识了项目的依赖库,而Compile声明了需要编译生的的源代码。如果我们新增一个类文件,但该文件并没有出现在csproj的Include列表中,那么编译的结果中将不含该类。

    <ItemGroup>
    
        <Reference Include="System" />
    
        <Reference Include="System.Core" />
    
        <Reference Include="System.Xml.Linq" />
    
        <Reference Include="System.Data.DataSetExtensions" />
    
        <Reference Include="Microsoft.CSharp" />
    
        <Reference Include="System.Data" />
    
        <Reference Include="System.Xml" />
    
      </ItemGroup>
    
      <ItemGroup>
    
        < Compile Include="Program.cs" />
    
        <Compile Include="PropertiesAssemblyInfo.cs" />
    
      </ItemGroup>

    Target

    Target是编译的任务单元,其根据taget的指令执行相应的动作,如下target表示执行编译的过程,使用所有Compile包含的内容,其中@(Compile)表示所有Compile的所有文件。

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

    如下target表示创建一个文件夹,其名称为为key值为BuildDir的Property的值。

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

    Task

    在target中的csc及makedir就是具体的task,MSBuild的具体执行是由相应的task来完成,我们可以以如下的方式 实现ITask接口,来自定义task。

    using System; 
    using Microsoft.Build.Framework; 
    using Microsoft.Build.Utilities; 
    
    namespace MyTasks 
    { 
        public class SimpleTask : Task 
        { 
            public override bool Execute() 
            { 
                return true; 
            } 
        } 
    }

    在target中使用这个Task

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
        <Target Name="MyTarget"> 
            <SimpleTask /> 
        </Target> 
    </Project> 

    根据Property,Item,Target,Task的定义MSbuild就可以完成应用的构建了,除了在VS中生成解决方案,我们可以在cmd中使用msbuild.exe xxxxxx.Csproj来完成构建。

    不同的VS对应不同版本的msbuild,其中VS2013的msbuild一般在C:Program Files (x86)MSBuild12.0目录下,VS2017的msbuild在vs的安装目录下。

  • 相关阅读:
    谈一谈循环的性能提升
    Web前端性能优化的9大问题
    随机获取一种颜色值的三种方法
    ES6还是ES2015?
    history.back(-1)和history.go(-1)的区别
    关于overflow-y:scroll ios设备不流畅的问题
    前端如何压缩图片
    【转】理解JavaScript之闭包
    关于如何给数字排序
    本地缓存localstorage使用
  • 原文地址:https://www.cnblogs.com/SuperChan/p/10240780.html
Copyright © 2011-2022 走看看