MSBuild是什麼?
MSBuild全稱(Microsoft Build Engine),是用于建構應用程式的平台。您可能不知道它,但是如果您在使用VS做開發,那麼一定時時刻刻在使用它。因為是它在背後為你管理生成你的項目檔案。當建立一個項目時,注意下項目檔案夾中的*.*proj檔案就是為MSBuild提供的,這是個文本檔案,基于XML格式,裡面包含有項目所包含的檔案,生成配置,輸出配置等資訊。當把一個檔案或者圖檔等添加到項目中,就會在這裡添加一個描述,反之則删除一個描述資訊;在項目屬性頁所做的配置也會在這裡存儲。
為何去了解MSBuild
想去了解這個源于以前學WPF時的疑惑(當時就想從MSBuild下手了,一直沒精力,拖到現在),因為不知道XAML為何就跑到生成的程式集,以及這個XAML标記最後變成什麼,WPF是如何處理這些XAML标簽與C#代碼的?一般寫代碼時我都會清楚的知道這個代碼最後經由編譯器變成了什麼,這樣心裡比較底。但是這個XAML,是看不透,看不透就心裡堵得慌,不踏實,我比較喜歡刨根問底,是以就想到通過這個入口探個究竟。
我想從MSBuild中得到什麼
第一解決我上面說疑惑;
第二了解項目中這些檔案是如何組織在一起并生成最終程式的(就像在WPF上Build是生成出來exe,而WP7則是出來一個XAP包,為何?);
第三了解到為止,以看懂了解為目的,不做深入研究。
MSBuild基本概念
MSBuild有四個基本塊(屬性、項、任務、目标):
MSBuild屬性:屬性是一些鍵/值對,主要用來存儲一些配置資訊。
MSBuild 項:主要是存儲一些項目檔案資訊,以及檔案的中繼資料資訊(如版本号)。
MSBuild任務:Build過程中的一些原子操作(如CSC、MakeDir)
MSBuild目标:按特定的順序将任務組織在一起,并允許在指令行單獨指定各個部分。
一句話總結MSBuild的作用:利用配置資訊對項目檔案實施特定順序的操作。
MSBuild屬性
屬性聲明方式:
1 <?xml version="1.0" encoding="utf-8"?>
2 <!--根元素,表示一個項目-->
3 <!--DefaultTargets用于定預設執行的目标-->
4 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <!--屬性都要包含在PropertyGroup元素内部-->
6 <PropertyGroup>
7 <!--聲明一個"linianhui"屬性,其值為"hello world"-->
8 <linianhui>hello world</linianhui>
9 </PropertyGroup>
10 <!--目标-->
11 <Target Name="build">
12 <!--MSBuild提供的一個内置任務,用于生成記錄資訊用$(屬性名)來引用屬性的值-->
13 <Message Text="$(linianhui)"></Message>
14 </Target>
15 </Project>
儲存此檔案到d:\helloworld.xml檔案。打開CMD視窗,輸入MSBuild helloworld.xml:

列印出“linianhui”屬性的值。MSBuild提供一些保留屬性,可以友善的引用$,如$(MSBuildProjectFile)将傳回項目檔案的完整名(helloworld.xml)。其他的保留屬性可以查閱MSDN幫助文檔。
MSBuild項
項聲明方式:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--項都要包含在ItemGroup元素内部-->
<ItemGroup>
<!--聲明一個"CSFile"的項,Include表示引入"csfile1.cs"檔案-->
<CSFile Include="csfile1.cs">
<!--Version表示項的中繼資料(附加資訊)-->
<Version>1.0.0.0</Version>
</CSFile>
<!--也可用";"一次引入多個檔案-->
<CSFile Include="csfile2.cs;csfile3.cs"/>
</ItemGroup>
<Target Name="build">
<!--@引用項的值,預設以";"分割開-->
<!--輸出"csfile1.cs;csfile2.cs;csfile3.cs"-->
<Message Text="@(CSFile)"></Message>
<!--可以加第二個參數替換預設的";"分隔符-->
<!--輸出"csfile1.cs+csfile2.cs+csfile3.cs"-->
<Message Text="@(CSFile,'+')"></Message>
<!--%引用項的中繼資料,輸出"1.0.0.0"-->
<Message Text="%(CSFile.Version)"></Message>
</Target>
</Project>
MSBuild任務
上述Msaage就是一個任務,用于列印資訊,常用的一些還包括CSC、MakeDir、Copy等等,大多任務都是有輸出資訊的,這些資訊可以通過OutPut元素存儲在屬性或者項中。先寫如下CS代碼:
1 //存為d:\MSBuildDemo.cs
2 public class MSBuildDemo
3 {
4 static void Main()
5 {
6 System.Console.WriteLine("MSBuild組織編譯");
7 }
8 }
然後更改項目檔案如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <ItemGroup>
4 <!--指定要編譯的檔案-->
5 <CSFile Include="MSBuildDemo.cs"/>
6 </ItemGroup>
7 <Target Name="build">
8 <!--使用Csc任務,對應csc編譯器-->
9 <!--Sources屬性表示要編譯的檔案集合-->
10 <!--TargetType表示編譯目标類型,對應csc編譯器的/target參數-->
11 <Csc Sources="@(CSFile)"
12 TargetType="exe">
13 <!--OutputAssembly為csc的輸出參數-->
14 <!--PropertyName表示把TaskParameter屬性所指定的輸出參數的值存儲到outputExeName這個屬性中-->
15 <!--Output還有一個ItemName屬性,表示存儲到一個項中-->
16 <Output TaskParameter="OutputAssembly" PropertyName="outputExeFileName"/>
17 </Csc>
18 <!--Message任務就可以使用csc所導出的屬性outputExeFileName了-->
19 <!--輸出MSBuildDemo.exe-->
20 <Message Text="$(outputExeFileName)"/>
21 <!--Exec任務可以運作帶有指定程式(可加參數)或指令-->
22 <!--運作剛從MSBuildDemo.cs源檔案編譯好的程式-->
23 <!--運作結果為"MSBuild組織編譯"-->
24 <Exec Command="$(outputExeFileName)"></Exec>
25 </Target>
26 </Project>
用MSbuild執行此項目檔案,如期正确列印資訊。
MSBuild目标
上面的一個例子中Target元素就是MSBuild目标,此目标按照編譯源代碼、列印編譯好的程式檔案名、執行該檔案這個順序組織了這三個任務。這就是目标所要做的事情。先簡單介紹到這裡吧,關于(屬性、項、任務、目标)的一些擴充資訊會在下一篇介紹。如有錯誤之處,歡迎指正!
注:以上資料全部來自MSDN幫助文檔。https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild
作者:
Blackheart出處:
http://linianhui.cnblogs.com本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。