'dotnet publish' 使用 Release 設定
如果目標架構是 .NET 8 或更新版本,dotnet publish
命令現在會使用 Release
組態,而非預設使用 Debug
組態。
先前的行為
除非先前已明確指定組態,或 PublishRelease
已設定為 true
,否則 dotnet publish
會使用 Debug
組態。
PublishRelease
屬性 已加入 .NET 7,作為此重大變更的途徑。 您之前可以將 DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS
環境變數設定為在屬於 Visual Studio 解決方案的專案中,使用 PublishRelease
。
新的行為
如果您要使用 .NET 8 SDK 或更新版本進行開發,根據預設,dotnet publish
會針對 TargetFramework
設定為 net8.0
或更新版本的專案,使用 Release
組態。 如果您有已將 Debug
硬式編碼至輸出路徑的 CI/CD 指令碼、測試或程式碼,此變更可能會中斷您的工作流程。
如果專案以多個版本為目標,只有在當您發佈 (例如,使用 dotnet publish -f net8.0
) 時,指定 .NET 8 或更新版本的目標 Framework 時,才會套用新的行為。
對於解決方案中的專案:
如果提供解決方案檔案,
dotnet publish
可以在 Visual Studio 解決方案中發佈所有專案。 對於將 .NET 8 或更新版本設為目標的解決方案專案,如果未定義PublishRelease
值,則會將該值隱含地設為true
。 不過,為了讓dotnet publish
判斷要用於解決方案的正確組態,解決方案中的所有專案都必須同意其PublishRelease
值。 如果解決方案中的舊專案已將PublishRelease
設定為false
,您也應該針對任何新的 .NET 8 以上的專案,明確地將屬性設定為false
。這項變更可能會導致
dotnet publish
的效能迴歸,尤其是包含許多專案的解決方案。 為了解決此問題,已引入新的環境變數DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS
。無法再辨識
DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS
環境變數。
導入的版本
.NET 8 Preview 1
中斷性變更的類型
變更原因
在大部分情況下,當您發佈時,您想要最佳化程式碼,而且可以透過排除偵錯資訊,讓應用程式保持較小。 長久以來,客戶一直要求 Release
作為 publish
的預設組態。 此外,Visual Studio 已有數年的行為。
已移除 DOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS
環境變數,因為它啟用的行為現在是預設行為,而且不再需要細微的控制項。
建議的動作
若要完全停用新行為,您可以將
DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE
環境變數設定為true
(或任何其他值)。 此變數會影響dotnet publish
和dotnet pack
。若要明確指定發佈的
Debug
組態,請使用-c
或--configuration
選項搭配dotnet publish
。如果您的 CI/CD 管線因為硬式編碼的輸出路徑而中斷,請將路徑更新為
Release
,而不是Debug
,使用DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE
環境變數停用新的行為,或指定應該使用Debug
組態。如果您要發佈解決方案,且遭中斷,您可以明確地將
PublishRelease
設定為true
(或設定為false
,以還原為先前的行為)。<PropertyGroup> <PublishRelease>true</PublishRelease> </PropertyGroup>
或者,您可以在 Directory.Build.Props 檔案中指定屬性。 不過,如果您在此檔案中將其設為
false
,您仍然需要在解決方案中 .NET 8 以上的專案中明確將屬性設定為false
。 同樣地,如果某些專案明確設定的值與 Directory.Build.Props 檔案中的值不同,發佈將會失敗。如果您要發佈解決方案,且效能已迴歸,您可以將
DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS
環境變數設定為true
(或任何其他值),以移除迴歸。 不過,如果您設定此變數,而且解決方案包含 .NET 8 以上的專案以及將目標設為 .NET 7 或更舊版本的專案,發佈將會失敗,直到所有專案皆定義PublishRelease
為止。 此變數會影響dotnet publish
和dotnet pack
。