自訂組建
使用標準建置程序 (匯入 Microsoft.Common.props 和 Microsoft.Common.targets) 的 MSBuild 專案有幾個擴充性攔截程序,可以用來自訂您的建置程序。
許多可自訂的建置作業都是由屬性所控制。 請務必知道設定屬性值的方式和位置,才能產生所需的效果。 您可以在命令列上設定屬性 (,以及在回應檔) 、 Directory.Build.props等特殊檔案、匯入的檔案或專案檔中設定屬性。 請務必知道屬性的使用位置、設定或變更以及匯入檔案的順序,包括 .NET SDK 之類的 SDK 的隱含匯入。
如需屬性清單,請參閱 MSBuild 通用屬性。
探索自訂選項
下列自訂選項會依增加複雜度和影響範圍的順序列出。 建議您使用最不復雜的自訂選項來提供您的用途,從這份清單頂端開始。
自訂選項 | Description |
---|---|
將引數新增至 MSBuild 命令列 | 設定會影響所有相依專案的主要專案建置和組建的全域屬性。 |
自訂單一專案的組建 | 將屬性新增至 .props 或 .targets 檔案,以自訂群組建設定。 |
在建置程式中處理產生的檔案 | 如何確定產生的檔案已正確包含組建輸出。 |
自訂一或多個專案的組建 | 將屬性新增至 Directory.Build.props ,或將屬性和目標新增至 Directory.Build.targets ,以自訂資料夾下所有專案的組建。 這項技術適用于設定 SDK 所設定或使用的屬性,以及設定自訂範圍,使其影響資料夾或子資料夾中的所有專案。 |
自訂您的本機組建 | 在本機電腦上對組建進行變更,而不會影響共用原始程式檔。 |
自訂所有 .NET 組建 | 針對 .NET 組建,使用全系統範圍自訂群組建。 |
自訂 C++ 組建 | 自訂 C++ 組建,範圍設定為專案、方案、資料夾,或由系統上安裝 MSBuild 所控管的所有組建。 |
將引數新增至專案的命令列 MSBuild 引動過程
您可以在命令列上設定全域屬性。 全域屬性會影響所有專案組建,包括相依性。 回想一下,建置專案會自動觸發所有專案相依性的可能組建。 MSBuild 的正常行為是建置任何過期的相依專案。 這些相依專案組建會從與原始專案相同的命令列使用相同的全域屬性設定來啟動。
來源目錄中或其上的 Directory.Build.rsp 檔案將會套用到專案的命令列組建。 如需詳細資料,請參閱 MSBuild 回應檔。
選擇將屬性加入 .props 或是 .targets 檔案
MSBuild 需相依於匯入順序,且屬性的最後一個定義 (或是 UsingTask
或目標) 將會是系統所使用的定義。
使用明確匯入時,您可以隨時從 .props
或 .targets
檔案匯入。 以下是廣泛使用的慣例:
.props
檔案會以匯入順序提早匯入。.targets
檔案會在建置順序中延遲匯入。
此慣例會由 <Project Sdk="SdkName">
匯入強制執行 (也就是 Sdk.props 的匯入會在該檔案所有內容之前先發生,而 Sdk.targets 則會在檔案的所有內容之後最後發生)。
決定要將屬性置於何處時,請使用下列一般指導方針:
針對許多屬性,其被定義的位置本身並不重要,因為它們不會被覆寫,且在執行階段會變成唯讀。
針對可能會在個別專案中自訂的行為,請在檔案中
.props
設定預設值。藉由讀取可能自訂屬性的值,避免在檔案中
.props
設定相依屬性,因為在 MSBuild 讀取使用者專案之前,不會發生自訂。在檔案中
.targets
設定相依屬性,因為它們會從個別專案挑選自訂專案。如果您需要覆寫屬性,請在所有使用者專案自訂專案有機會生效之後,在檔案中
.targets
執行。 請謹慎使用衍生屬性;您可能也需要覆寫衍生屬性。在屬性) 上設定條件的檔案中包含
.props
專案 (。 系統會在任何項目之前先考慮所有屬性,因此使用者專案屬性自訂項目會被收取,而這能讓使用者的專案有機會Remove
或Update
由匯入所引進的任何項目。在檔案中
.targets
定義目標。 不過,如果.targets
SDK 匯入檔案,請記住,此案例會讓覆寫目標變得更困難,因為使用者的專案預設沒有覆寫目標的位置。可能的話,請盡量在評估期間自訂屬性,而非在目標內變更屬性。 此指導方針可讓載入專案並了解其進行情況的工作變得更加容易。