.NET 5 (および .NET Core) 以降のバージョンはますます多くのプラットフォームで利用できるようになっているため、それを使用するアプリやライブラリをパッケージ化、名前付け、およびバージョン管理する方法を知っていると便利です。 そうすることで、パッケージの管理者は、ユーザーの .NET の実行環境に左右されることなく一貫した体験が保証されるようにサポートできます。 この記事は以下のユーザーに役立ちます。
- ソースから .NET をビルドしようとしている。
- 結果として生じるレイアウトまたは生成されるパッケージに影響する可能性がある .NET CLI に変更を加えたい。
ディスク レイアウト
インストールした .NET は複数のコンポーネントで構成されています。これらはファイル システムで次のようにレイアウトされています。
{dotnet_root} (0) (*)
├── dotnet (1)
├── dnx (22)
├── LICENSE.txt (8)
├── ThirdPartyNotices.txt (8)
├── host (*)
│ └── fxr (*)
│ └── <fxr version> (2)
├── sdk (*)
│ └── <sdk version> (3)
├── sdk-manifests (4) (*)
│ └── <sdk feature band version>
├── library-packs (21) (*)
├── 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)
│ ├── runtime.<rid>.Microsoft.DotNet.ILCompiler (*)
│ │ └── <runtime version> (19)
│ └── Microsoft.NETCore.App.Runtime.NativeAOT.<rid> (*)
│ └── <runtime version> (20)
├── 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)
└── dnx (23)
(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)。(22) dnx
dnxスクリプトは、ユーザー コマンドに沿って SDK 内のdotnet dnxコマンドに転送することを目的とする実行可能なシェル スクリプトです。 この機能は、主に、.NET Tools などのさまざまな種類の .NET アプリケーションの取得と起動をエンド ユーザーにとって簡単にするために存在します。 これは、Node のnpxコマンドと同様に考えてください。dnxワンショット実行プロセスの実際の機能のほとんどは、バージョン管理された SDK ディレクトリのdotnetCLI 実装で処理されるため、バージョンに依存しません。
ホストは 1 つですが、他のコンポーネントのほとんどはバージョン管理されたディレクトリに入っています (2、3、5、6)。 つまり、複数のバージョンが並列インストールされるので、それらをシステム上に置くことができます。
(2) host/fxr/<fxr バージョン> には、ホストが使用するフレームワーク解決ロジックが含まれます。 ホストでは、インストールされている最新の hostfxr が使用されます。 hostfxr は、.NET アプリケーションの実行時に適切なランタイムを選択する役割があります。 たとえば、.NET 7.0.0 用としてビルドされたアプリケーションは、2.0.5 が利用できればそれを利用します。 同様に、hostfxr は開発中、適切な SDK を選択します。
(3) sdk/<sdk バージョン> SDK (別名 "ツール") は、.NET のライブラリやアプリケーションを記述し、ビルドするために使用されるマネージド ツールのセットです。 SDK には、.NET CLI、マネージ言語コンパイラ、MSBuild、関連するビルド タスクとターゲット、NuGet、新しいプロジェクト テンプレートなどが含まれています。
(4) sdk-manifests/<sdk 機能バンド バージョン> 任意のワークロード インストールで必要になるアセットの名前とバージョンは、このフォルダーに格納されているワークロード マニフェストで保守管理されます。 フォルダー名は、SDK の機能バンド バージョンです。 そのため、6.0.102 などの SDK バージョンでは、このフォルダーの名前は通常、7.0.100 になります。 ワークロードがインストールされると、ワークロードの資産に必要に応じて、 metadata および template-pack のフォルダーが作成されます。 ディストリビューションでは、ワークロードを < フォルダー以外のユーザー パスにインストールする場合、空の /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, 23) dotnet.1.gz、dotnet
dotnet.1.gzは dotnet のマニュアル ページです。dotnetは dotnet host(1) のシンボリック リンクです。dnxは、dnxシェル スクリプト (22) へのシンボリック リンクです。 これらのファイルは、システム統合のために、よく知られている場所にインストールされます。(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) のファイルへのシンボリック リンクが含まれています。
(19) runtime.<rid>.Microsoft.DotNet.ILCompiler/<runtime バージョン> これらのファイルを使用すると、ターゲット プラットフォームで NativeAOT アプリケーションをビルドできます。 .NET 9 では、ターゲット プラットフォーム用の NativeAOT アプリケーションを構築することもできます。 .NET 9 以降に存在する可能性があります。
(20) Microsoft.NETCore.App.Runtime.NativeAOT.<rid>/<runtime バージョン> これらのファイルを使用すると、ターゲット プラットフォーム用の NativeAOT アプリケーションをビルドできます。 .NET 10 以降に存在する可能性があります。
(21) ライブラリ パック には NuGet パッケージ ファイルが含まれています。 SDK は、このフォルダーを NuGet ソースとして使用するように構成されています。 .NET ビルドによって提供される NuGet パッケージの一覧を以下に示します。
(*) でマークされたフォルダーは、複数のパッケージによって使用されます。 一部のパッケージ形式 (たとえば、rpm) では、このようなフォルダーを特別に処理する必要があります。 パッケージのメンテナンス担当者は、このことに対処する必要があります。
library-packs (21) に追加されるパッケージ ファイルには、Microsoft がターゲット プラットフォーム用に配布しないパッケージを指定できます。 ファイルは、Microsoft が配布するパッケージのこともあり、その場合、library-packs は、プラットフォームのパッケージ配布ガイドラインを満たすようにソースからビルドしたパッケージを提供します。 .NET ビルドには、次のパッケージが含まれています。
| パッケージ名 | 発行者: Microsoft | 次の場合に必要です |
|---|---|---|
Microsoft.DotNet.ILCompiler.<version>.nupkgMicrosoft.NET.ILLink.Tasks.<version>.nupkg |
☑ | NativeAOT |
推奨パッケージ
.NET バージョン管理は、ランタイム コンポーネント [major].[minor] バージョン番号に基づきます。
SDK バージョンは同じ [major].[minor] を利用し、SDK の機能とパッチ意味論を結合する非依存の [patch] が与えられます。
例: SDK バージョン 2.2.302 は、2.2 ランタイム対応の SDK の第 3 機能リリースの第 2 パッチ リリースです。 バージョン管理のしくみの詳細については、.NET のバージョン管理の概要に関するページを参照してください。
パッケージには、その名前にバージョン番号の一部が含まれているものもあります。 それによって、特定のバージョンをインストールすることができます。 バージョンの残りの部分はバージョン名には含まれていません。 それによって、OS パッケージ マネージャーはパッケージを更新できます (セキュリティ修正の自動インストールなど)。 サポートされるパッケージ マネージャーは Linux 固有です。
推奨するパッケージを、以下に示します。
dotnet-sdk-[major].[minor]: 特定のランタイム用に最新の SDK をインストールします- バージョン: <sdk バージョン>
- 例: dotnet-sdk-7.0
- Contains: (3),(4),(18),(21)
-
依存関係:
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]
dotnet-sdk-aot-[major].[minor]- プラットフォーム NativeAOT 用の SDK コンポーネントをインストールします- バージョン: <sdk バージョン>
- 例: dotnet-sdk-aot-9.0
- 含まれるもの: (19, 20)
-
依存関係:
dotnet-sdk-[major].[minor]、 コンパイラ ツールチェーン、および .NET ランタイムが依存するライブラリの開発者パッケージ
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
- Contains: (1),(8),(9),(10),(16),(22),(23)
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パッケージから除外されます。NuGetFallbackFolderはnuget.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 は、packs のコンテンツのコピーを表す、shared の下にいくつかのデバッグ コンテンツを含みます。 .NET レイアウトでは、packs ディレクトリは .NET アプリケーションのビルドに使用されます。 デバッグ シナリオがないため、デバッグ tarball の packs 下にデバッグ コンテンツをパッケージ化しないでください。
パッケージをビルドする
dotnet/source-build リポジトリでは、.NET SDK のソース ターボールとそのすべてのコンポーネントをビルドする方法が提供されます。 この source-build リポジトリの出力は、この記事の最初のセクションで説明したレイアウトに一致します。
.NET