.NET の配布パッケージ

.NET 5 (および .NET Core) 以降のバージョンはますます多くのプラットフォームで利用できるようになっているため、それを使用するアプリやライブラリをパッケージ化、名前付け、およびバージョン管理する方法を知っていると便利です。 そうすることで、パッケージの管理者は、ユーザーの .NET の実行環境に左右されることなく一貫した体験が保証されるようにサポートできます。 この記事は以下のユーザーに役立ちます。

  • ソースから .NET をビルドしようとしている。
  • 結果として生じるレイアウトまたは生成されるパッケージに影響する可能性がある .NET CLI に変更を加えたい。

ディスク レイアウト

インストールした .NET は複数のコンポーネントで構成されています。これらはファイル システムで次のようにレイアウトされています。

{dotnet_root}                    (0)              (*)
├── dotnet                       (1)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   └── <sdk version>            (3)
├── sdk-manifests                (4)              (*)
│   └── <sdk feature band version>
├── library-packs                (4)              (*)
├── metadata                     (4)              (*)
│   └── workloads
│       └── <sdk feature band version>
├── template-packs               (4)              (*)
├── packs                                         (*)
│   ├── Microsoft.AspNetCore.App.Ref              (*)
│   │   └── <aspnetcore ref version>     (11)
│   ├── Microsoft.NETCore.App.Ref                 (*)
│   │   └── <netcore ref version>        (12)
│   ├── Microsoft.NETCore.App.Host.<rid>          (*)
│   │   └── <apphost version>            (13)
│   ├── Microsoft.WindowsDesktop.App.Ref          (*)
│   │   └── <desktop ref version>        (14)
│   ├── NETStandard.Library.Ref                   (*)
│   │   └── <netstandard version>        (15)
│   ├── Microsoft.NETCore.App.Runtime.<rid>       (*)
│   │   └── <runtime version>            (18)
│   └── Microsoft.AspNetCore.App.Runtime.<rid>    (*)
│       └── <aspnetcore version>         (18)
├── shared                                        (*)
│   ├── Microsoft.NETCore.App                     (*)
│   │   └── <runtime version>     (5)
│   ├── Microsoft.AspNetCore.App                  (*)
│   │   └── <aspnetcore version>  (6)
│   ├── Microsoft.AspNetCore.All                  (*)
│   │   └── <aspnetcore version>  (6)
│   └── Microsoft.WindowsDesktop.App              (*)
│       └── <desktop app version> (7)
└── templates                                     (*)
│   └── <templates version>      (17)
/
├── etc/dotnet
│       └── install_location     (16)
├── usr/share/man/man1
│       └── dotnet.1.gz          (9)
└── usr/bin
        └── dotnet               (10)
  • (0) {dotnet_root} は、すべての .NET メジャー バージョンとマイナー バージョンの共有ルートです。 複数のランタイムがインストールされている場合は、 {dotnet_root} フォルダー (たとえば、 {dotnet_root}/shared/Microsoft.NETCore.App/6.0.11{dotnet_root}/shared/Microsoft.NETCore.App/7.0.0) を共有します。 {dotnet_root} フォルダーの名前は、バージョンに依存せず、つまり単に dotnetである必要があります。

  • (1) dotnet ホスト (別名 "muxer (マルチプレクサー)") には 2 つの異なるロールがあります。アプリケーションを起動するランタイムのアクティブ化と、コマンドをディスパッチする SDK のアクティブ化です。 ホストはネイティブの実行可能ファイルです (dotnet.exe)。

ホストは 1 つですが、他のコンポーネントのほとんどはバージョン管理されたディレクトリに入っています (2、3、5、6)。 つまり、複数のバージョンが並列インストールされるので、それらをシステム上に置くことができます。

  • (2) host/fxr/<fxr バージョン> には、ホストが使用するフレームワーク解決ロジックが含まれます。 ホストでは、インストールされている最新の hostfxr が使用されます。 hostfxr は、.NET アプリケーションの実行時に適切なランタイムを選択する役割があります。 たとえば、.NET 7.0.0 用としてビルドされたアプリケーションは、7.0.5 が利用できればそれを利用します。 同様に、hostfxr は開発中、適切な SDK を選択します。

  • (3) sdk/<sdk バージョン> SDK (別名 "ツール") は、.NET のライブラリやアプリケーションを記述し、ビルドするために使用されるマネージド ツールのセットです。 SDK には、.NET CLI、マネージ言語コンパイラ、MSBuild、関連するビルド タスクとターゲット、NuGet、新しいプロジェクト テンプレートなどが含まれています。

  • (4) sdk-manifests/<sdk 機能バンド バージョン> 任意のワークロード インストールで必要になるアセットの名前とバージョンは、このフォルダーに格納されているワークロード マニフェストで保守管理されます。 フォルダー名は、SDK の機能バンド バージョンです。 そのため、7.0.102 などの SDK バージョンでは、このフォルダーの名前は 7.0.100 になるでしょう。 ワークロードがインストールされると、ワークロードのアセットである library-packsmetadatatemplate-packs に必要になるため、次のフォルダーが作成されます。 ディストリビューションでは、ワークロードを dotnet フォルダー以外のユーザー パスにインストールする場合、空の /metadata/workloads/<sdkfeatureband>/userlocal ファイルを作成できます。 詳細については、GitHub イシュー dotnet/installer#12104 を参照してください。

共有フォルダーには、フレームワークが含まれています。 共有フレームワークは、さまざまなアプリケーションで利用できるように、中央の場所で一連のライブラリを提供します。

  • (5) shared/Microsoft.NETCore.App/<runtime バージョン> このフレームワークには、.NET のランタイムと補助マネージド ライブラリが含まれています。

  • (6) shared/Microsoft.AspNetCore.{App,All}/<aspnetcore バージョン> には、ASP.NET Core ライブラリが含まれます。 Microsoft.AspNetCore.App の下にあるライブラリは、.NET プロジェクトの一部として開発され、サポートされています。 Microsoft.AspNetCore.All の下にあるライブラリは、サードパーティ製ライブラリも含まれるスーパーセットです。

  • (7) shared/Microsoft.Desktop.App/<デスクトップ アプリ バージョン> には、Windows デスクトップ ライブラリが含まれます。 これは、Windows 以外のプラットフォームには含まれていません。

  • (8) LICENSE.txt,ThirdPartyNotices.txt は、それぞれ .NET ライセンスと、.NET で利用されるサードパーティ ライブラリのライセンスです。

  • (9,10) dotnet.1.gz、dotnetdotnet.1.gz は dotnet のマニュアル ページです。 dotnet は dotnet host(1) のシンボリック リンクです。 これらのファイルは、システム統合のために、よく知られている場所にインストールされます。

  • (11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref には、.NET と ASP.NET Core のそれぞれの x.y バージョンの API が記述されています。 これらのパックは、それのターゲット バージョンのコンパイル時に使用されます。

  • (13) Microsoft.NETCore.App.Host.<rid> には、プラットフォーム rid のネイティブ バイナリが含まれます。 このバイナリは、.NET アプリケーションをそのプラットフォームのネイティブ バイナリにコンパイルするときのテンプレートです。

  • (14) Microsoft.WindowsDesktop.App.Ref には、Windows Desktop アプリケーションの x.y バージョンの API が記述されています。 これらのファイルは、そのターゲットに対してコンパイルする場合に使用されます。 これは、Windows 以外のプラットフォームにはありません。

  • (15) NETStandard.Library.Ref には、netstandard x.y の API が記述されています。 これらのファイルは、そのターゲットに対してコンパイルする場合に使用されます。

  • (16) /etc/dotnet/install_location は、{dotnet_root} の完全なパスを含むファイルです。 パスの末尾は改行文字である場合があります。 ルートが /usr/share/dotnet の場合は、このファイルを追加する必要はありません。

  • (17) templates には、SDK で使用されるテンプレートが含まれます。 たとえば、dotnet new はここからプロジェクト テンプレートを検索します。

  • (18) Microsoft.NETCore.App.Runtime.<rid>/<runtime version>、Microsoft.AspNetCore.App.Runtime.<rid>/<aspnetcore version> これらのファイルを使用すると、自己完結型アプリケーションを構築できます。 これらのディレクトリには、(2)、(5)、(6) のファイルへのシンボリック リンクが含まれています。

(*) でマークされたフォルダーは、複数のパッケージによって使用されます。 一部のパッケージ形式 (たとえば、rpm) では、このようなフォルダーを特別に処理する必要があります。 パッケージのメンテナンス担当者は、このことに対処する必要があります。

.NET バージョン管理は、ランタイム コンポーネント [major].[minor] バージョン番号に基づきます。 SDK バージョンは同じ [major].[minor] を利用し、SDK の機能とパッチ意味論を結合する非依存の [patch] が与えられます。 次に例を示します。SDK バージョン 7.0.302 は、7.0 ランタイム対応の SDK の第 3 機能リリースの第 2 パッチ リリースです。 バージョン管理のしくみの詳細については、.NET のバージョン管理の概要に関するページを参照してください。

パッケージには、その名前にバージョン番号の一部が含まれているものもあります。 それによって、特定のバージョンをインストールすることができます。 バージョンの残りの部分はバージョン名には含まれていません。 それによって、OS パッケージ マネージャーはパッケージを更新できます (セキュリティ修正の自動インストールなど)。 サポートされるパッケージ マネージャーは Linux 固有です。

推奨するパッケージを、以下に示します。

  • dotnet-sdk-[major].[minor]: 特定のランタイム用に最新の SDK をインストールします

    • バージョン:<sdk バージョン>
    • 例: dotnet-sdk-7.0
    • 次を含む: (3)、(4)、(18)
    • 依存関係:dotnet-runtime-[major].[minor]aspnetcore-runtime-[major].[minor]dotnet-targeting-pack-[major].[minor]aspnetcore-targeting-pack-[major].[minor]netstandard-targeting-pack-[netstandard_major].[netstandard_minor]dotnet-apphost-pack-[major].[minor]dotnet-templates-[major].[minor]
  • aspnetcore-runtime-[major].[minor]: 特定の ASP.NET Core ランタイムをインストールします

    • バージョン:<aspnetcore ランタイム バージョン>
    • 例: aspnetcore-runtime-7.0
    • 次を含む: (6)
    • 依存関係:dotnet-runtime-[major].[minor]
  • dotnet-runtime-deps-[major].[minor](省略可能): 自己完結型アプリケーションを実行する依存関係をインストールします

    • バージョン:<ランタイム バージョン>
    • 例: dotnet-runtime-deps-7.0
    • 依存関係:ディストリビューション固有の依存関係
  • dotnet-runtime-[major].[minor]: 特定のランタイムをインストールします

    • バージョン:<ランタイム バージョン>
    • 例: dotnet-runtime-7.0
    • 次を含む: (5)
    • 依存関係:dotnet-hostfxr-[major].[minor]dotnet-runtime-deps-[major].[minor]
  • dotnet-hostfxr-[major].[minor]: 依存関係

    • バージョン:<ランタイム バージョン>
    • 例: dotnet-hostfxr-7.0
    • 次を含む: (2)
    • 依存関係:dotnet-host
  • dotnet-host: 依存関係

    • バージョン:<ランタイム バージョン>
    • 例: dotnet-host
    • 次を含む: (1)、(8)、(9)、(10)、(16)
  • dotnet-apphost-pack-[major].[minor]: 依存関係

    • バージョン:<ランタイム バージョン>
    • 次を含む: (13)
  • dotnet-targeting-pack-[major].[minor]: 最新ではないランタイムを対象にできます

    • バージョン:<ランタイム バージョン>
    • 次を含む: (12)
  • aspnetcore-targeting-pack-[major].[minor]: 最新ではないランタイムを対象にできます

    • バージョン:<aspnetcore ランタイム バージョン>
    • 次を含む: (11)
  • netstandard-targeting-pack-[netstandard_major].[netstandard_minor]: netstandard バージョンを対象にできます

    • バージョン:<sdk バージョン>
    • 次を含む: (15)
  • dotnet-templates-[major].[minor]

    • バージョン:<sdk バージョン>
    • 次を含む: (17)

次の 2 つのメタ パッケージは省略可能です。 エンド ユーザーは、最上位のパッケージ (dotnet-sdk) を抽象化することで、完全な .NET パッケージのインストールを簡略化するという点で価値があります。 これらのメタ パッケージは、特定の .NET SDK バージョンを参照します。

  • dotnet[major] - 指定した SDK バージョンをインストールします

    • バージョン:<sdk バージョン>
    • 例: dotnet7
    • 依存関係:dotnet-sdk-[major].[minor]
  • dotnet - ディストリビューションによって決定された特定の SDK バージョンをプライマリ バージョン (通常は利用可能な最新バージョン) にインストールします

    • バージョン:<sdk バージョン>
    • 例: dotnet
    • 依存関係:dotnet-sdk-[major].[minor]

dotnet-runtime-deps-[major].[minor] では、ディストリビューション固有の依存関係を理解している必要があります。 ディストリビューションのビルド システムは、これを自動的に得ることができる可能性があるため、このパッケージは省略可能です。これらの場合、これらの依存関係は dotnet-runtime-[major].[minor] パッケージに直接追加されます。

パッケージの内容がバージョン付きフォルダーにある場合、[major].[minor] のパッケージ名はバージョン付きのフォルダー名と同じになります。 netstandard-targeting-pack-[netstandard_major].[netstandard_minor] を除くすべてのパッケージでは、これは .NET バージョンとも同じになります。

パッケージ間の依存関係では、バージョン要件以上を使用する必要があります。 たとえば、dotnet-sdk-7.0:7.0.401 には aspnetcore-runtime-7.0 >= 7.0.6 が必要です。 これにより、ユーザーはルート パッケージ (たとえば、dnf update dotnet-sdk-7.0) を使用してインストールをアップグレードできます。

ほとんどのディストリビューションで、ソースからビルドするすべての成果物を必要とします。 これはパッケージにいくつかの影響を与えます。

  • shared/Microsoft.AspNetCore.All の下にあるサードパーティ製ライブラリは、ソースから簡単にビルドできません。 そのため、そのフォルダーは aspnetcore-runtime パッケージから除外されます。

  • NuGetFallbackFoldernuget.org からバイナリ成果物を利用して入力されます。 空のままにしてください。

複数の dotnet-sdk パッケージで NuGetFallbackFolder に同じファイルが提供されることがあります。 パッケージ マネージャーの問題を回避するには、これらのファイルを同じにします (チェックサム、変更日など)。

デバッグ パッケージ

デバッグ コンテンツは、この記事で前述した .NET パッケージ分割に従うデバッグ名付きパッケージにパッケージ化する必要があります。 たとえば、dotnet-sdk-[major].[minor] パッケージのデバッグ コンテンツは、dotnet-sdk-dbg-[major].[minor] という名前のパッケージに含める必要があります。 デバッグ コンテンツは、バイナリと同じ場所にインストールする必要があります。

バイナリの例をいくつか次に示します。

{dotnet_root}/sdk/<sdk version> ディレクトリには、次の 2 つのファイルが必要です。

  • dotnet.dll - dotnet-sdk-[major].[minor] パッケージと共にインストールされる
  • dotnet.pdb - dotnet-sdk-dbg-[major].[minor] パッケージと共にインストールされる

{dotnet_root}/shared/Microsoft.NETCore.App/<runtime version> ディレクトリには、次の 2 つのファイルが必要です。

  • System.Text.Json.dll - dotnet-runtime-[major].[minor] パッケージと共にインストールされる
  • System.Text.Json.pdb - dotnet-runtime-dbg-[major].[minor] パッケージと共にインストールされる

{dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version> ディレクトリには、次の 2 つのファイルが必要です。

  • Microsoft.AspNetCore.Routing.dll - aspnetcore-runtime-[major].[minor] パッケージと共にインストールされる
  • Microsoft.AspNetCore.Routing.pdb - aspnetcore-runtime-dbg-[major].[minor] パッケージと共にインストールされる

.NET 8.0 以降では、ソース ビルドによって生成されたすべての .NET デバッグ コンテンツ (PDB ファイル) を、dotnet-symbols-sdk-<version>-<rid>.tar.gz という名前の tarball で使用できます。 このアーカイブには、.NET SDK tarball - dotnet-sdk-<version>-<rid>.tar.gz のディレクトリ構造に一致するサブディレクトリ内の PDB が含まれています。

デバッグ tarball ではすべてのデバッグ コンテンツを使用できますが、すべてのデバッグ コンテンツが同じように重要であるとは言えません。 エンド ユーザーは、主に、shared/Microsoft.AspNetCore.App/<aspnetcore version> ディレクトリと shared/Microsoft.NETCore.App/<runtime version> ディレクトリの内容に関心があります。

sdk/<sdk version> の SDK コンテンツは、.NET SDK ツールセットのデバッグに役立ちます。

次のパッケージは、推奨されるデバッグ パッケージです。

  • aspnetcore-runtime-dbg-[major].[minor] - 特定の ASP.NET Core ランタイムのデバッグ コンテンツをインストールします

    • バージョン:<aspnetcore ランタイム バージョン>
    • 例: aspnetcore-runtime-dbg-8.0
    • 含む: (6) のデバッグ コンテンツ
    • 依存関係:aspnetcore-runtime-[major].[minor]
  • dotnet-runtime-dbg-[major].[minor] - 特定のランタイムのデバッグ コンテンツをインストールします

    • バージョン:<ランタイム バージョン>
    • 例: dotnet-runtime-dbg-8.0
    • 含む: (5) のデバッグ コンテンツ
    • 依存関係:dotnet-runtime-[major].[minor]

次のデバッグ パッケージは省略可能です。

  • dotnet-sdk-dbg-[major].[minor] - 特定の SDK バージョンのデバッグ コンテンツをインストールします
    • バージョン:<sdk バージョン>
    • 例: dotnet-sdk-dbg-8.0
    • 含む: (3)、(4)、(18) のデバッグ コンテンツ
    • 依存関係:dotnet-sdk-[major].[minor]

デバッグ tarball は、shared のコンテンツのコピーを表す、packs の下にいくつかのデバッグ コンテンツを含みます。 .NET レイアウトでは、packs ディレクトリは .NET アプリケーションのビルドに使用されます。 デバッグ シナリオがないため、デバッグ tarball の packs 下にデバッグ コンテンツをパッケージ化しないでください。

パッケージをビルドする

dotnet/source-build リポジトリでは、.NET SDK のソース ターボールとそのすべてのコンポーネントをビルドする方法が提供されます。 この source-build リポジトリの出力は、この記事の最初のセクションで説明したレイアウトに一致します。