'dotnet pack' では Release 構成が使用される

コードを NuGet パッケージにパックする dotnet pack コマンドでは、既定で Debug 構成ではなく Release 構成が使用されるようになりました。

以前の動作

以前は、構成が明示的に指定されているか、PackReleasetrue に設定されていない限り、dotnet pack では Debug 構成が使用されていました。

この破壊的変更へのパスとして、.NET 7 で PackRelease プロパティが追加されました。 以前は、Visual Studio ソリューションに含まれているプロジェクトで PackRelease を使用するように DOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS 環境変数を設定できました。

新しい動作

.NET 8 SDK 以降のバージョンで開発している場合、"すべての" プロジェクトに対して、dotnet pack では既定で Release 構成が使用されます。 Debug を出力パスにハードコーディングした CI/CD スクリプト、テスト、またはコードがある場合は、この変更によってワークフローが壊れる可能性があります。 また、Debug 構成が明示的に指定 (例: dotnet pack --configuration Debug を使用) されていない限り、パックされたアプリをデバッグすることはできません。

dotnet pack は、複数のターゲット フレームワーク モニカー (TFM) に対して同時にパックできます。 プロジェクトが複数のバージョンを対象とし、ターゲットごとに PackRelease 値が異なる場合は、ある TFM によって Release 構成がパックされ、他の TFM によって 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 と共に使用します。

  • ハードコーディングされた出力パスが原因で CI/CD パイプラインが壊れている場合は、パスを Debug ではなく Release に更新するか、DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE 環境変数を使用して新しい動作を無効にするか、または Debug 構成を使用するように指定します。

  • 1 つ以上のプロジェクトで PackRelease の値が明示的に設定されているために、パック中のソリューションが壊れている場合は、各プロジェクトで PackReleasefalse に明示的に設定する必要があります。

    <PropertyGroup>
      <PackRelease>false</PackRelease>
    </PropertyGroup>
    
  • ソリューションのパック時にパフォーマンスが低下した場合は、DOTNET_CLI_LAZY_PUBLISH_AND_PACK_RELEASE_FOR_SOLUTIONS 環境変数を true (またはその他の値) に設定して、回帰を削除することができます。 この変数を使用しており、いずれかのプロジェクトで PackRelease が定義される場合は、すべてのプロジェクトでこれを定義する必要があります。または、Directory.Build.Props ファイルを使用できます。 この変数は、dotnet publishdotnet pack の両方に影響を与えます。

関連項目