變更波 是 MSBuild 中的一組行為變更,您可以藉由將特定旗標設置為環境變數來選擇不參與。 其目的是要警告您潛在的干擾性變更,讓您在變更成為標準功能之前,能夠彈性地適應這些變更。 特定變更波中的所有功能只能一起啟用或停用,而不是個別啟用。
當您升級至新版本的 MSBuild 時,預設會啟用可能造成中斷的變更功能,但如果某個功能對您的組建造成負面影響,您可以輕鬆地停用這一系列的變更。 每個變更波都是由 MSBuild 版本號碼來識別(例如 16.8),但設定變更波只會控制可能會影響建置程式的特定功能,而不是該 MSBuild 版本中的所有變更。 本文稍後會 顯示每個變更波中的功能清單。 停用某個變更波也會停用該變更波之較高版本的變更波。
選擇不使用功能更新波
若要停用變更波中的功能,請將環境變數 MSBuildDisableFeaturesFromVersion 設定為變更波(或 MSBuild 版本),其中包含您想要 停用的功能。 這是針對這些功能開發的 MSBuild 版本。 請參閱變更波次與下列功能的對應關係。
持續存在的 MSBuild 程序會保留它們最初使用的價值 MSBuildDisableFeaturesFromVersion 。 在更改環境變數後,先關閉持久建置程序,再執行下一個建置。 對於使用 .NET CLI 執行的建置,請使用 dotnet build-server shutdown. 對於使用 Visual Studio 或 MSBuild.exe 執行的建置,請關閉 Visual Studio,並結束任何剩餘的 MSBuild.exe 處理程序。 否則,重複使用的流程可能會繼續使用先前的值,而平行建置的專案則可能使用不同的值。
MSBuildDisableFeaturesFromVersion 值
如果您未將 MSBuildDisableFeaturesFromVersion 設定為有效的變更波,您將會收到警告和/或預設為特定波。 下表顯示可能的設定:
MSBuildDisableFeaturesFromVersion 值 |
結果 | 收到警告嗎? |
|---|---|---|
| 未設定 | 啟用所有變更波,這表示啟用每個變更波背後的所有功能。 | 不 |
任何當前有效的變更波(例如,16.8) |
停用變更波後方的所有功能 16.8和更高。 |
不 |
無效值(例如,16.9 當有效波為 16.8 和 16.10時) |
預設為最接近的有效值 (遞增)。 例如,將 16.9 設定會預設為您 16.10。 |
不 |
不在輪替序列中(例如,當最高波為 17.1時的 17.0) |
限制到最接近的有效值。 例如,將 17.1 夾住 17.0,並將 16.5 夾住 16.8 |
是的 |
無效的格式(例如,16x8、17_0、garbage) |
啟用所有變更波,這表示啟用每個變更波背後的所有功能。 | 是的 |
變更波浪和相關聯的功能
變更波次的當前輪替
18.12
- 多執行緒建置使用空的 sentinel 當前目錄,任務後檢查 CWD,並在專案/建置完成時偵測未解決的相對路徑寫入。
- TaskHost 過去會在
-mt下以處理序外方式執行任務,並持續連線到啟動它們的處理序,且會隨該處理序一起退出,而不是繼續供任何其他處理序重複使用。 不同執行環境或架構的 TaskHosts 則不受影響。 - 任務記錄到 TaskHost 的事件——延伸錯誤、警告與訊息、關鍵訊息、遙測數據,以及路由器未列舉的其他事件類型——會傳送到父程序,而非被丟棄。
- RAR 為每個參照寫入一個結構化搜尋事件,而非為每個被拒絕的組件候選項寫入一則訊息。 此變更可減少二進位記錄大小。 事件的預設訊息使用不因文化特性而異的格式,而主控台和終端機記錄器則使用目前的 UI 文化特性來呈現。 將
MSBUILDDISABLEFEATURESFROMVERSION=18.12設為保留個別候選人訊息。 - RAR 現在會記錄版本衝突相依細節的結構化事件。 這些事件取代了用於 MSB3277 警告和低重要性診斷的冗長文字訊息。
- 事件包含 victor 與受害者的身分、依賴鏈及來源項目。
- 事件會從其結構化資料中呈現不變的英文訊息,且不傳送本地化格式字串。 內建面向使用者的記錄器會以目前使用中的 UI 文化重新呈現;其他消費者也可以利用結構化欄位來做同樣的事。
- 比二進位記錄格式 28 更舊的嚴格讀取器會拒絕較新的格式。 前向相容的讀取器會跳過結構化的衝突記錄。
- 將
MSBUILDDISABLEFEATURESFROMVERSION=18.12設為,以恢復舊有的本地化純文字事件。
18.11
- XmlPeek、XmlPoke 和 XslTransformation 預設為禁止嵌入的 DTD
- 程序外通訊使用較大的讀取緩衝區,並預緩衝 TaskHost 封包體以減少管線讀取。
- 還原不再丟棄會從磁碟重新載入變更檔案的 ProjectRootElementCache,因此隱式還原後的建置不會重新解析匯入閉包。
-
使用優化的 MSBuild 檔案規範匹配與枚舉。 以正則表達式為基礎的檔案 glob 模式使用文化不變的大小寫摺疊;設定
MSBUILDUSELEGACYCULTURESENSITIVEFILEGLOBS=1以保留舊有的目前文化大小寫摺疊,同時不停用其他 Wave 18.11 功能。 -
孤立(
-graph -isolate)建置在跨專案參考未透過ProjectReferenceTargets宣告的目標時,會以 MSB4252 確定性失敗,而不是在該參考專案先前剛好曾於該節點建置時就通過。
18.10
-
從
PWD開始,根據 Unix 邏輯上的目前目錄解析相對專案路徑,讓在符號連結目錄下進行的建置產生穩定的專案完整路徑及相關輸出路徑。 -
Restore 會將
ExcludeRestorePackageImports=true當作全域屬性傳遞,因此 NuGet 的還原不再觸發對每個專案的第二次評估。 -
-getProperty/-getItem(沒有目標)會在產生所需資料的階段後就停止評估,而不是執行完整評估,以避免後續階段(例如目標註冊)。
18.9
- 生成資源:Mark-of-the-Web 檔案中已輸入的 ResX 資料/元資料條目現在被視為不可信,並以 MSB3821 封鎖;解除封鎖檔案(或設定 MSBUILDDISABLEFEATURESFROMVERSION=18.9)以恢復先前的行為。 無論這波如何,ResXFileRef 的條目都會被封鎖。
- TaskHost 命名管路緩衝區預設為 1 MB(原為 128 KB),以降低大型 TaskHostConfiguration 封包的傳送背壓。 可透過 MSBUILDNODECONNECTIONBUFFERSIZE 進行調整
18.8
- RAR 任務:跨多個輸入屬性,針對專案目錄(非當前程序目錄)解析相對路徑
- 主控台、平行主控台與終端記錄器會將註冊記錄器(例如檔案記錄器與二進位記錄器)所寫的日誌檔案路徑印出,作為建置結束摘要的一部分。
18.7
- 在非 Windows 平台上,當發生 ERROR_ACCESS_DENIED 時會重試複製工作,以處理暫時性的鎖定衝突(例如 macOS CoW 檔案系統)
- 修正 ASP.NET WebSite 專案,以解析 netstandard2.0 相依性 - 將 TargetFrameworkVersion 傳遞至 RAR 工作,並為 .NET Framework 4.7.1 以上的 WebSite 專案複製 netstandard.dll Facade 組件。
18.6
- AbsolutePath.GetCanonicalForm 最佳化——當路徑不需要正規化時,避免進行成本高昂的 Path.GetFullPath 呼叫
- TaskHostTask 會將請求層級的全域屬性(例如 MSBuildRestoreSessionId)轉發給程序外的 TaskHost,並以 -mt 模式進行
- 修復 OOP TaskHost 檢查錯誤集合(改用 WarningsAsMessages 代替 WarningsAsErrors)中 ShouldTreatWarningAsError 的問題
- 修正當工具產生繼承 stdout/stderr 管線控制代碼的孫程序時,ToolTask 卡住的問題
18.5
- 使用 TaskEnvironment.GetAbsolutePath 時,FindUnderPath 與 AssignTargetPath 任務不再拋出無效路徑字元
- Linux 上的 AssignTargetPath 尊重檔案系統的大小寫區分,而非總是忽略大小寫
18.4
不再輪播的變更波次
16.8
16.10
- 當條件中的屬性展開有空格符時發生 錯誤
- 允許使用 TargetPath 的自定義 CopyToOutputDirectory 位置
- 允許用戶名稱包含特定特殊字元的使用者在使用 exec 時成功建置。
- 無法解析 SDK 時還原操作失敗
- 優化對 glob 的評估
17.0
- 排程器應遵循 BuildParameters.DisableInprocNode
- 不要在 .NET Framework 上編譯 globbing regexes
- 預設為傳遞性地複製內容項目
-
參考元件現在預設不會再放在
bin目錄中 (這裡還原,並帶回這裡 ) - 改善偵錯體驗:新增全域交換器 MSBuildDebugEngine;從 BuildManager 插入二進位記錄器;將靜態圖形列印為 .dot 檔案
- 修正 BuildManager 與 LoggingService 中的死結
- 優化檔案記錄器和控制台記錄器的診斷層級
- 最新的不可變檔案檢查
- 添加 Microsoft.IO.Redist 用於目錄列舉
- 全進程快取 ToolsetConfigurationSection
- 將 RAR 輸出路徑正規化
17.4
- 在載入元件時遵循deps.json標準
- 在平臺交涉
Platform考慮將 視為預設值 - 將已接受的 SDK 名稱比對模式新增至 SDK 指令清單
- 拋出警告,指出無效的專案類型
- MSBuild 伺服器
17.6
17.8
- [RAR] 在 SDK 提供的引用上不要執行 I/O
- 複製 之前刪除目的地檔案
- 從 SHA1 移至 SHA256 以進行哈希工作
-
淘汰自定義衍生的 BuildEventArgs - 只有在執行期間允許 BinaryFormatter 時,才能選擇退出該功能
MSBuild.runtimeconfig.json
17.10
-
AppDomain 組態可在不使用 BinFmt 的情況下序列化 - 只有在執行階段允許使用 BinaryFormatter 時,才能透過編輯
MSBuild.runtimeconfig.json選擇停用此功能。 請注意, 任何使用 BinaryFormatter 的使用都不安全。 - 在 .NET 框架中預設存在序列化自訂事件警告
- 快取 SDK 解析器資料適用於整個處理程序
- 目標參數將不加引號,也就是說,參數目標名稱中的 ';' 符號一律視為分隔符號
- 在 AssignLinkMetadata 目標中將連結中繼資料新增至資源
- 將 Version switch 的輸出改為以換行字元結尾
- 將 NuGet.Framework 載入次要 AppDomain(僅限MSBuild.exe)
- 環境變更時更新特性
- 執行任務不會修剪 ConsoleOutput 的前置空白
- 引入 [MSBuild]::StableStringHash 的多載
- 使 ToolTask 的標準輸出和標準錯誤編碼與主控台代碼頁保持一致
17.12
- 記錄純量參數的 TaskParameterEvent
- Convert.ToString 在屬性評估時會對所有類型使用 InvariantCulture
- 修正 ResultsCache 中建置結果過度分享的問題
- 將 ParameterName 和 PropertyName 新增至 TaskParameterEventArgs
- 如果任何接收端要求,則輸出 eval 屬性
- 將 Microsoft.DotNet.MSBuildSdkResolver 載入預設載入內容(僅限 MSBuild.exe)
17.14
-
.SLNX 支援——對 .sln 和 .slnx 使用新的解析器在發現相容性問題後已回退 -
支援 RAR 自訂文化- 詳情請參見 11607 - VS 遙測
18.3
FAQ
為什麼以其他每個版本為目標來旋轉變化波出?
我們認為,這足以與受影響的人進行討論,並協助適應這些變化。
為什麼環境變數而非項目屬性?
在某些情況下,我們想要在 MSBuild 載入專案之前,將功能放在變更波下。 因此,變更波需要使用環境變數。
為何選擇退出而非選擇加入?
選擇退出對我們來說是更好的方法,否則當功能影響客戶的構建時,我們可能會得到有限的回饋。