'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 publishdotnet 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 publishdotnet pack

另請參閱