自訂組建

使用標準建置程序 (匯入 Microsoft.Common.props 和 Microsoft.Common.targets) 的 MSBuild 專案有幾個擴充性攔截程序,可以用來自訂您的建置程序。

許多可自訂的建置作業都是由屬性所控制。 請務必知道如何和何處設定屬性值,才能產生所需的效果。 您可以在命令列上設定屬性 (,以及在回應檔) 、 Directory.Build.props、匯入檔案或專案檔等特殊檔案中設定屬性。 請務必知道屬性的使用位置、設定或變更,以及匯入檔案的順序,包括從 .NET SDK 之類的 SDK 隱含匯入。

如需屬性的清單,請參閱 MSBuild 通用屬性

探索自訂選項

下列自訂選項會依照增加複雜度和影響範圍的順序列出。 建議您使用最不復雜的自訂選項,從此清單頂端開始提供您的目的。

自訂選項 描述
將引數新增至 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 專案 (。 系統會在任何項目之前先考慮所有屬性,因此使用者專案屬性自訂項目會被收取,而這能讓使用者的專案有機會 RemoveUpdate 由匯入所引進的任何項目。

  • 在檔案中 .targets 定義目標。 不過,如果 .targets 檔案是由 SDK 匯入,請記住,此案例會讓覆寫目標變得更困難,因為使用者的專案沒有預設覆寫它的位置。

  • 可能的話,請盡量在評估期間自訂屬性,而非在目標內變更屬性。 此指導方針可讓載入專案並了解其進行情況的工作變得更加容易。

另請參閱