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.0MSBuild Items:
MSBuild Items - Visual StudioUsing MSBuild: https://msdn.microsoft.com/en-us/library/dd393573.aspx
Build Process:
Understanding the Build Process推薦閱讀:
※C#的編譯過程
※自學指南 Flex & Bison
※[新聞] 大部分Intel hardware intrinsic 將在 .NET Core 2.1 中啟用
※機器學習與編譯優化的入門介紹