MSBuild

MSBuild

前序:鑒於上篇文章寫得很隨性,有許多Bug,尤其是在MSBuild上。所以,今天特整理一份MSBuild的文章。

概述(OverView)

MSBuild是一個免費的開源構建工具集,用於管理本地C++代碼.在Visual Studio2013之前,MSBuild是作為.NET框架的一部分,但是在其之後,MSBuild被綁定到了Visual Studio.所以,Visual Studio依賴於MSBuild,但是MSBuild並不依賴於Visual Studio.(本文主要簡單闡述了MSBuild構建流程中的項目文件語法,關於具體MSBuild的構建步驟可查看參考文檔或MSDN)

MSBuild 包含了軟體開發的一套自動化流程,包括編譯、打包、測試、發布和創建說明文檔。MSBuild 的執行基於MSBuild 項目文件,該文件和Apache Ant 使用的XML具有相似的語法規則;

在命令行中使用MSBuild(Using MSBuild at a Command Prompt)

MSBuild.exe MyProj.proj /property:Configuration=Debug

圖一

項目文件(Project File)

MSBuild依賴的項目文件(Project File)是一個基於XML的項目文件,該文件用來描述即將建立的項目;

Properties

屬性,顧名思義,在構建中充當一種類似變數的角色:

定義:

<PropertyGroup> <BuildDir>Build</BuildDir> </PropertyGroup>

用法:可以通過$(property name)來在項目文件中使用屬性.

<Configuration Condition=" $(Configuration) == ">Debug</Configuration>

Items

  • Items是整個構建系統中的輸入部分,代表的就是代碼文件;
  • Items根據item的名稱,將其分成不同的Item 類型;
  • Item類型是可以用作Task參數的item集合;
  • Item的類型是Task中的執行過程中的Step;

在項目文件中使用Items (Creating Items in a Project File)

Item類型被包含在項目文件(.csproj)中的<ItemGroup></ItemGroup>下,ItemGroup的子元素的名稱,即是項的類型(Item Type)。其中,Include指定了項類型包含的文件

<ItemGroup> <Compile Include = "file1.cs"/> <Compile Include = "file2.cs"/> </ItemGroup>

其中,Compile指的是項類型,它可以包含多個文件;也支持下面這種寫法:多個文件用分號隔開

<ItemGroup> <Compile Include = "file1.cs;file2.cs"/> </ItemGroup>

在項目文件中引用項類型(Referencing Items in a Project File)

在項目文件中使用項類型,語法:@(Item Type),可以為Task指定具體的項類型;

使用通配符指定項類型的文件(Using Wildcards to Specify Items)

可以使用**、*和?三種通配符指定一組文件作為構建的輸入.

  • ?通配符指定一個單一的字元
  • *通配符指定零個或多個字元
  • **通配符匹配部分路徑

包含當前項目中所有的cs文件

<CSFile Include="*.cs"/>

D盤下的所欲cs文件

<CSFile Include="D:/**/*.cs"/>

使用Exclude屬性 (Using the Exclude Attribute)

Exclude屬性是用來排除某些不想加入到項類型中的文件,比如,不想DoNotBuild.cs文件加入到CSFile項類型

<ItemGroup> <CSFile Include="*.cs" Exclude="DoNotBuild.cs"/> </ItemGroup>

需要注意的是,Exclude只排除當前Item中Include已經包含的文件,不會影響到項類型中其他的item,例如:項類型Compile並不會排除Form1.cs

<Compile Include="*.cs" /> <Compile Include="*.res" Exclude="Form1.cs" />

項元數據(Item Metadata)

項類型中除了有Include屬性和ExClude屬性之外,還可以有項元數據.項元數據向Task提供了更多的關於項類型的信息;項元數據是以鍵值對的方式來表示,如下:

<ItemGroup> <CSFile Include="one.cs;two.cs"> <Culture>Fr</Culture> </CSFile> </ItemGroup>

在項目文件中引用項元數據(Referebcing Item Metadata in a Project File)

如果想在項目文件(.csproj)中使用項元數據,語法:%(ItemType.ItemMetadataName)

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Stuff Include="One.cs" > <Display>false</Display> </Stuff> <Stuff Include="Two.cs"> <Display>true</Display> </Stuff> </ItemGroup> <Target Name="Batching"> <Message Text="@(Stuff)" Condition=" %(Display) == true "/> </Target> </Project>

任務(Task)

Task是MSBuild的構建過程中的可執行的代碼單元。任務的執行邏輯在託管代碼中,繼承了ITask介面.在項目文件中,通過UsingTask將ClassName映射到MSBuild.

<UsingTask TaskName="TaskName" AssemblyName = "AssemblyName" TaskFactory = "ClassName" Condition="String A==String B" />

目標(Targets)

Targets是一組任務的集合,可以在此設置構建流程的入口。比如上一篇文章提到的csc,在MSBuild中也是使用的csc來編譯的C#文件,是通過類似下面的任務來進行調用的

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

在Visual Studio 中通常Targets是引用的公共文件(Microsoft.CSharp.targets),該文件位於MSbuild同目錄下.

參考文檔(References):

MSBuild Update Log In Visual Studio 2013:

Whats New in MSBuild 12.0?

msdn.microsoft.com

MSBuild Items:

MSBuild Items - Visual Studio?

docs.microsoft.com圖標

Using MSBuild: msdn.microsoft.com/en-u

Build Process:

Understanding the Build Process?

docs.microsoft.com圖標
推薦閱讀:

C#的編譯過程
自學指南 Flex & Bison
[新聞] 大部分Intel hardware intrinsic 將在 .NET Core 2.1 中啟用
機器學習與編譯優化的入門介紹

TAG:編譯器 | msbuild | C |