'dotnet pack' 使用 Release 設定

dotnet pack 命令會將程式碼封裝到 NuGet 套件中,現在預設會使用 Release 設定,而非 Debug 設定。

先前的行為

除非先前已明確指定組態,或 PackRelease 已設定為 true,否則 dotnet pack 會使用 Debug 組態。

PackRelease 屬性 已加入 .NET 7,作為此重大變更的途徑。 您之前可以將 DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 環境變數設定為在屬於 Visual Studio 解決方案的專案中,使用 PackRelease

新的行為

如果您要使用 .NET 8 SDK 或更新版本進行開發,則 dotnet pack 預設會針對所有Release專案使用 設定。 如果您有已將 Debug 硬式編碼至輸出路徑的 CI/CD 指令碼、測試或程式碼,此變更可能會中斷您的工作流程。 此外,除非明確指定 (例如使用 dotnet pack --configuration Debug) Debug 設定,否則您無法偵錯已封裝的應用程式。

dotnet pack 可以同時封裝多個目標 Framework Moniker (TFM)。 如果您的專案以多個版本為目標,且針對不同目標有不同的 PackRelease 值,則可能會發生衝突,其中有些 TFM 會封裝 Release 設定,而其他則會封裝 Debug 設定。

對於解決方案中的專案:

  • 如果提供解決方案檔案,dotnet pack 可以在 Visual Studio 解決方案中封裝所有專案。 對於方案中的每個專案,如果未定義,則會隱含地將 PackRelease 的值設定為 true。 為了讓 dotnet pack 判斷要使用的正確設定,解決方案中的所有專案都必須同意其 PackRelease 值。

  • 這項變更可能會導致 dotnet pack 的效能下降,尤其是包含許多專案的解決方案。 為了解決此問題,已引入新的環境變數 DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS

  • 無法再辨識 DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 環境變數。

導入的版本

.NET 8 Preview 1

中斷性變更的類型

這項變更可能會影響來源相容性,同時也是行為變更

變更原因

在大部分情況下,當您建立封裝時,您想要最佳化程式碼,且可以透過排除偵錯資訊,讓封裝保持較小。

已移除 DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 環境變數,因為其啟用的行為現在是預設行為,而且不再需要細微的控制項。

  • 若要完全停用新行為,您可以將 DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE 環境變數設定為 true (或任何其他值)。 此變數會影響 dotnet publishdotnet pack

  • 若要明確指定封裝的 Debug 設定,請使用 -c--configuration 選項搭配 dotnet pack

  • 如果您的持續整合與持續傳遞管線因為硬式編碼的輸出路徑而中斷,請將路徑更新為 Release 而非 Debug、使用 DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE 環境變數停用新的行為,或指定應該使用 Debug 設定。

  • 如果您要封裝解決方案,且因為一或多個專案明確設定 PackRelease 的值而中斷,則應該在每個專案中將 PackRelease 明確設定為 false

    <PropertyGroup>
      <PackRelease>false</PackRelease>
    </PropertyGroup>
    
  • 如果您要封裝解決方案,且效能已迴歸,則可以將 DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS 環境變數設定為 true (或任何其他值) 以移除迴歸。 如果您使用此變數和任何專案定義 PackRelease,則所有專案都必須予以定義,或者,您可以使用 Directory.Build.Props 檔案。 此變數會影響 dotnet publishdotnet pack

另請參閱