MSBuild (Visual C++) 概觀
MSBuild 是 Visual C++ 專案的標準建置系統。在 Visual Studio 整合式開發環境 (IDE) 中建置專案時,會用到 msbuild.exe 工具、XML 專案檔和選擇性設定檔。您可以在命令列上執行 msbuild.exe 加專案檔,不過 IDE 另外提供一個使用者介面,讓您更容易進行設定和建置專案。本概觀會說明 Visual C++ 如何使用 MSBuild 系統。
必要條件
請閱讀以下 MSBuild 相關文件。
MSBuild
MSBuild 概念的概觀。MSBuild 參考
MSBuild 系統的參考資訊。MSBuild 專案檔案結構描述參考
列出 MSBuild XML 結構描述項目,以及其屬性、父項目和子項目。請特別注意 ItemGroup、PropertyGroup、Target 和 Task 項目。MSBuild 命令列參考
描述可以搭配 msbuild.exe 使用的命令列引數和選項。MSBuild 工作參考
描述 MSBuild 工作。請特別注意以下 Visual C++ 特有的工作:BscMake 工作、CL 工作、CPPClean 工作、LIB 工作、Link 工作、MIDL 工作、MT 工作、RC 工作、SetEnv 工作、VCMessage 工作、XDCMake 工作、XSD 工作。
命令列中的 MSBuild
MSBuild 命令列參考文件中提及的下列陳述式說明 msbuild.exe 工具使用隱含或明確的 project file 引數 (Visual C++ 專案為 .vcxproj 檔),以及不使用或使用多個命令列 options。
msbuild.exe [project file] [options]
使用 /target (或 /t) 以及 /property (或 /p) 命令列選項,可覆寫專案檔中指定的屬性和目標。
專案檔有一個重要功能是指定「目標」(Target,這是指套用至專案的特定作業),以及執行這項作業所需的輸入和輸出。專案檔可以指定一個或多個目標,其中可以包括預設目標。
每個目標由一組一個或多個「工作」(Task) 所組成,每個工作又各由一個 .NET Framework 類別代表,其中包含一個可執行命令。例如,CL 工作包含 cl.exe 命令。
「工作參數」(Task Parameter) 是類別工作的屬性,通常代表可執行命令的命令列選項。例如,CL 工作的 FavorSizeOrSpeed 參數對應到 /Os 和 /Ot 編譯器選項。
其他工作參數都支援 MSBuild 基礎結構。例如,Sources 工作參數指定可由其他工作使用的一組工作。如需 MSBuild 工作的詳細資訊,請參閱 MSBuild 工作參考。
大部分工作都需要輸入和輸出,例如檔案名稱、路徑以及字串、數值或布林參數。例如,一般輸入範例是要進行編譯之 .cpp 原始程式檔的名稱。重要輸入參數的範例則是指定組建組態和平台的字串,如 "Debug|Win32"。輸入和輸出是由一個或多個使用者定義的 XML Item 項目 (包含在 ItemGroup 項目中) 所指定。
專案檔也可以指定使用者定義的「屬性」(Property) 和「項目-定義-群組」(Item-Definition-Group)「項目」(Item)。屬性和項目會形成名稱/值組,名稱/值組可以在組建中當做變數。名稱/值組的名稱部分會定義「巨集」(Macro),值部分則宣告「巨集值」(Macro Value)。屬性巨集可使用 $(<名稱>) 標記法來存取,項目巨集則使用 %(<名稱>) 標記法來存取。
專案檔中的其他 XML 項目可以用來測試巨集,接著依條件設定任何巨集的值或控制組建的執行。巨集名稱和常值字串可以串連在一起,產生路徑和檔案名稱之類的建構。在命令列上,/property 選項可以設定或覆寫專案屬性。在命令列上不能參考項目。
MSBuild 系統可以在一個目標之前或之後,依條件執行另一個目標。此外,系統也可以根據目標所用的檔案是否較系統發行的檔案新,據以建置目標。
IDE 中的 MSBuild
當您在 IDE 中設定專案屬性然後儲存專案時,Visual C++ 會將專案設定寫入至專案檔。專案檔包含專案專屬的設定,但不包含建置專案需要的所有設定。專案檔包含 Import 項目,這些項目包括額外「支援檔案」(Support File) 的網路, 支援檔案中包含建置專案需要的其餘屬性、目標和設定。
支援檔案中大部分目標和屬性只是為了實作建置系統而存在。下一節討論一些有用的目標和屬性,您可以在 MSBuild 命令列中指定這些目標和屬性。若想了解其他目標和屬性,請瀏覽支援檔案目錄中的檔案。
支援檔案目錄
根據預設,主要的 Visual C++ 支援檔案位於下列目錄。
目錄 |
描述 |
---|---|
drive:\Program Files\MSBuild\Microsoft.Cpp\v4.0\ |
包含目標使用的主要目標檔案 (.targets) 和屬性檔案 (.props)。根據預設,$(VCTargetsPath) 巨集會參考這個目錄。 |
drive:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\platform\ |
包含平台專屬的目標和屬性檔案,用來覆寫其父目錄中的目標和屬性。這個目錄也包含 .dll 檔,用來定義此目錄中目標所使用的工作。 platform 預留位置代表 Itanium、Win32 或 x64 子目錄。 |
drive:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\platform\ PlatformToolsets\toolset\ |
包含可用來讓組件產生 9.0 或 Visual C++ 10.0 應用程式的目錄。 platform 預留位置代表 Itanium、Win32 或 x64 子目錄。toolset 預留位置代表 v90 或 v100 Toolset 子目錄。 |
支援檔案
支援檔案目錄包含具有下列副檔名的檔案。
副檔名 |
描述 |
---|---|
.targets |
包含 Target XML 項目,用來指定目標執行的工作。也可能包含 Property Group、Item Group、Item Definition Group 和使用者定義的 Item 項目,這些項目用來指派檔案和命令列選項給工作參數。 如需詳細資訊,請參閱 Target 項目 (MSBuild)。 |
.props |
包含 Property Group 和使用者定義的 Property XML 項目 (Element),用來指定建置期間使用的檔案和參數設定。 也可能包含 Item Definition Group 和使用者定義的 Item XML 項目 (Element),用來指定其他設定。項目 (Item) 定義群組中定義的項目 (Item) 類似於屬性,但無法由命令列存取。Visual C++ 專案檔經常使用項目 (Item) 取代屬性,用以代表設定。 如需詳細資訊,請參閱 ItemGroup 項目 (MSBuild)、ItemDefinitionGroup 項目 (MSBuild) 和 Item 項目 (MSBuild)。 |
.xml |
包含 XML 項目 (Element),用來宣告和初始化 IDE 使用者介面項目,例如屬性工作表和屬性頁,以及文字方塊和清單方塊控制項。 .xml 檔案直接支援 IDE,而非 MSBuild。不過,指派 IDE 屬性的值是要用來建置屬性和項目 (Item)。 大部分 .xml 檔案都位於地區設定專用子目錄,例如,「英文-美國」地區的檔案位於 $(VCTargetsPath)\1033\。 |
使用者目標和屬性
若想以最有效率的方式在命令列中使用 MSBuild,建議您了解哪些屬性和目標有用且相關。大部分屬性和目標都是協助實作 Visual C++ 建置系統,因此和使用者無關。本節說明一些重要的使用者導向屬性和目標。
PlatformToolset 屬性
PlatformToolset 屬性決定組建中使用的是 Visual C++ 2010 還是 Visual C++ 2008 Toolset。屬性的值與常值字串串連在一起形成目錄路徑,此目錄包含建置特定平台之專案所需的屬性和目標檔案。
將 PlatformToolset 屬性設為 v100 表示使用 Visual C++ 2010 工具來建置應用程式。
msbuild myProject.vcxproj /p:PlatformToolset=v100
將 PlatformToolset 屬性設為 v90 則表示使用 Visual C++ 2008 工具來建置應用程式。您的電腦上必須已安裝 Visual C++ 2008 Toolset,此屬性才能生效。
msbuild myProject.vcxproj /p:PlatformToolset=v90
UseEnv 屬性
依預設,目前專案的特定平台設定會覆寫 PATH、INCLUDE、LIB、LIBPATH、CONFIGURATION 和 PLATFORM 環境變數。將 UseEnv 屬性設為 true,可以確保環境變數不被覆寫。
msbuild myProject.vcxproj /p:UseEnv=true
目標
Visual C++ 支援檔案中有數百個目標,不過大部分都是系統導向的目標,使用者可以忽略。大部分系統目標的名稱會加上底線 (_) 前置字元,或以 "PrepareFor"、"Compute"、"Before"、"After"、"Pre" 或 "Post" 為開頭。
下表列出一些重要的使用者導向目標。
目標 |
描述 |
---|---|
BscMake |
執行 Microsoft Browse Information Maintenance Utility 工具 bscmake.exe。 |
建置 |
建置專案。 這是專案的預設目標。 |
ClCompile |
執行 Visual C++ 編譯器工具 cl.exe。 |
Clean |
刪除暫存和中繼組建檔案。 |
Lib |
執行 Microsoft 32 位元 Library Manager 工具 lib.exe。 |
Link |
執行 Visual C++ 連結器工具 link.exe。 |
ManifestResourceCompile |
從資訊清單擷取資源清單,然後執行 Microsoft Windows 資源編譯器工具 rc.exe。 |
Midl |
執行 Microsoft 介面定義語言 (MIDL) 編譯器工具 midl.exe。 |
Rebuild |
清除然後建置您的專案。 |
ResourceCompile |
執行 Microsoft Windows 資源編譯器工具工具 rc.exe。 |
XdcMake |
執行 XML 文件工具 xdcmake.exe。 |
Xsd |
執行 XML 結構描述定義工具 xsd.exe。 |