作為.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="Properties\AssemblyInfo.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 xxx\xxx.Csproj來完成構建。

不同的VS對應不同版本的msbuild,其中VS2013的msbuild一般在C:\Program Files (x86)\MSBuild\12.0目錄下,VS2017的msbuild在vs的安裝目錄下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM