其實說來慚愧,在幾天之前,其實自己也不知道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的安裝目錄下。