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

ターゲット フレームワークが .NET 8 以降のバージョンの場合、dotnet publish コマンドでは、既定で Debug 構成ではなく Release 構成が使用されるようになりました。

以前の動作

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

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

新しい動作

.NET 8 SDK 以降のバージョンで開発している場合、TargetFrameworknet8.0 以降のバージョンに設定されているプロジェクトに対して、dotnet publish では既定で Release 構成が使用されます。 Debug を出力パスにハードコーディングした CI/CD スクリプト、テスト、またはコードがある場合は、この変更によってワークフローが壊れる可能性があります。

プロジェクトが複数のバージョンを対象としている場合、新しい動作は、発行時に .NET 8 以降のターゲット フレームワークを指定 (例: dotnet publish -f net8.0 を使用) した場合にのみ適用されます。

ソリューション内のプロジェクトの場合:

  • dotnet publish では、ソリューション ファイルが指定されている場合、Visual Studio ソリューション内のすべてのプロジェクトを発行できます。 .NET 8 以降を対象とするソリューション プロジェクトでは、PublishRelease の値が未定義の場合、暗黙的に true に設定されます。 ただし、dotnet publish でソリューションに使用する正しい構成を決定するには、ソリューション内のすべてのプロジェクトで PublishRelease の値が一致する必要があります。 ソリューション内の古いプロジェクトで PublishReleasefalse に設定されている場合は、新しい .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

破壊的変更の種類

この変更は、ソースの互換性に影響を与える可能性があり、動作の変更でもあります。

変更理由

発行時にはほとんどの場合、コードを最適化する必要があり、デバッグ情報を除外することでアプリを小さく保つことができます。 顧客は長年にわたり、publish の既定の構成を Release にすることを求めていました。 また、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 パイプラインが壊れている場合は、パスを Debug ではなく Release に更新するか、DOTNET_CLI_DISABLE_PUBLISH_AND_PACK_RELEASE 環境変数を使用して新しい動作を無効にするか、または Debug 構成を使用するように指定します。

  • 発行中のソリューションが壊れている場合は、PublishReleasetrue (または、以前の動作に戻すには 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 の両方に影響を与えます。

関連項目