MSBuild 概觀
更新:2007 年 11 月
Microsoft Build Engine (MSBuild) 是 Microsoft 和 Visual Studio 的新組建 (Build) 平台。MSBuild 在處理及建置 (Build) 軟體方面完全透明,可以讓開發人員在未安裝 Visual Studio 的建置實驗室環境中設計及建置產品。這個主題提供的概觀包括下列各項:
MSBuild 專案檔的基本項目。
如何使用 MSBuild 建置專案。
MSBuild 的進階功能。
Visual Studio 如何使用 MSBuild 建置專案。
專案檔
MSBuild 採用了新的 XML 架構專案檔格式,不但易懂、容易擴充,還具備 Microsoft 的完整支援。MSBuild 專案檔格式可以讓開發人員完整描述需要建置哪些項目,以及如何使用不同的平台和組態來建置這些項目。此外,專案檔格式還能讓開發人員撰寫可重複使用的建置規則供個別檔案使用,讓這些組建 (Build) 在產品內部的不同專案中,仍有一致的表現。以下章節描述 MSBuild 專案檔格式的部分基本項目。
項目
項目是指建置系統的輸入,會依據使用者所定義的集合名稱組成項目集合。這些項目集合可以做為工作的參數,工作會使用集合所含的個別項目,來執行建置處理序的步驟。
在專案檔中宣告項目 (Item) 的方式,是使用項目集合的名稱建立項目 (Element),做為 ItemGroup 項目的子項目。例如,下列程式碼會建立名為 Compile 的項目集合,其中包含兩個檔案。
<ItemGroup>
<Compile Include = "file1.cs"/>
<Compile Include = "file2.cs"/>
</ItemGroup>
在整個專案檔中,您可以使用 @(ItemCollectionName) 語法來參考項目集合。例如,可以使用 @(Compile) 來參考前述範例中的項目集合。
在進階的建置案例中,可以使用萬用字元宣告項目,項目中並可包含額外中繼資料 (Metadata)。如需項目的詳細資訊,請參閱 MSBuild 項目。
屬性
屬性表示成對的索引鍵/值組,可以用來設定組建。項目和屬性具有下列幾點差異:
項目儲存在集合中,而屬性則含有單一純量值 (Scalar Value)。
項目不能從項目集合中移除,而屬性則可以在定義之後變更其值。
項目可以含有中繼資料,也可以使用 %(ItemMetadata) 標記法,但屬性不行。
宣告屬性的方式,是建立一個和屬性同名的項目,做為 PropertyGroup 項目的子項目。例如,下列程式碼會建立名為 BuildDir 的屬性,其值為 Build。
<PropertyGroup>
<BuildDir>Build</BuildDir>
</PropertyGroup>
您可以使用 $(PropertyName) 語法,在整個專案檔中參考屬性。例如,可以使用 $(BuildDir) 來參考前述範例中的屬性。如需屬性的詳細資訊,請參閱 MSBuild 屬性。
工作
工作是 MSBuild 專案用來執行建置作業之可執行程式碼的可重複使用單元。例如,工作可能是編譯輸入檔,或是執行外部工具。建立工作後,可以將工作提供給不同專案中的不同開發人員共用,而且可以重複使用。
工作的執行邏輯是以 Managed 程式碼撰寫,並且使用 UsingTask 項目對應到 MSBuild。若想撰寫自己的工作,您可以撰寫一個實作 ITask 介面的 Managed 型別。如需撰寫工作的詳細資訊,請參閱 HOW TO:撰寫工作。
MSBuild 附有許多常用工作,例如複製檔案用的 Copy、建立目錄用的 MakeDir,以及編譯 Visual C# 原始程式碼檔案用的 Csc。如需可用工作的完整清單和用法的相關資訊,請參閱 MSBuild 工作參考。
MSBuild 專案檔中執行工作的方式,是使用工作的名稱建立一個項目,做為 Target 項目的子項目。工作通常接受參數,這些參數會做為項目的屬性 (Attribute) 傳遞。MSBuild 項目集合和屬性 (Property) 均可做為參數使用。例如,下列程式碼會呼叫 MakeDir 工作,並且把在前一個範例中宣告的 BuildDir 屬性值傳遞給此工作。
<Target Name="MakeBuildDirectory">
<MakeDir
Directories="$(BuildDir)" />
</Target>
如需工作的詳細資訊,請參閱 MSBuild 工作。
目標
目標 (Target) 會將工作以特殊順序組成群組,並公開 (Expose) 專案檔的區段做為建置處理序的進入點 (Entry Point)。目標通常會組織成許多邏輯區段,以方便擴充及閱讀。將建置步驟切分成許多個目標之後,您就可以從其他目標呼叫一段建置處理序,不需要重複在每個目標內複製那一段程式碼。例如,如果建置處理序的許多個進入點都必須建置參考,您可以建立一個建置參考的目標,再於每個需要建置參考的進入點執行此目標。
在專案檔中,目標是使用 Target 項目宣告。例如,下列程式碼會建立名為 Compile 的目標,這個目標接著使用在前一個範例所宣告的項目集合呼叫 Csc 工作。
<Target Name="Compile">
<Csc Sources="@(Compile)" />
</Target>
在進階案例中,目標能夠描述彼此之間的關係並執行相依性分析,如果目標是最新版,即可略過建置處理序的整個區段。如需目標的詳細資訊,請參閱 MSBuild 目標。
使用 MSBuild 進行建置
從命令列執行 MSBuild 時,您會使用適當的命令列選項,將專案檔傳遞給 MSBuild.exe。命令列選項能讓您設定屬性、執行特定目標,以及指定記錄器。例如,您可以使用下列命令列語法,在 Configuration 屬性設為 Debug 的情況下建置 MyProj.proj 檔案。
MSBuild.exe MyProj.proj /property:Configuration=Debug
如需 MSBuild 命令列選項的詳細資訊,請參閱 MSBuild 命令列參考。
安全性注意事項: |
---|
在建置下載的專案之前,請先判斷程式碼的可靠性。MSBuild 專案檔有可能執行危害您系統的工作。 |
進階概念
在建置期間,您可以使用 MSBuild 進行進階作業,例如將錯誤、警告和訊息記錄到主控台或其他記錄器、執行目標的相依性分析,以及對項目中繼資料批次處理工作和目標。如需這些進階概念的詳細資訊,請參閱 MSBuild 進階概念。
Visual Studio 整合
Visual Studio 會使用 MSBuild 專案檔格式儲存 Managed 專案的建置資訊。透過 Visual Studio 加入和變更的專案設定會反映在每個專案所產生的 .*proj 檔案中。Visual Studio 會使用 MSBuild 的裝載執行個體 (Hosted Instance) 建置 Managed 專案,也就是說,Managed 專案可以在 Visual Studio 中建置,也可以從命令列建置 (即使未安裝 Visual Studio),結果完全相同。如需 Visual Studio 如何使用 MSBuild 的詳細資訊,請參閱 MSBuild 進階概念。