.NET Core の配布パッケージ.NET Core distribution packaging

.NET Core はますます多くのプラットフォームで使用できるようになってきているため、.NET Core をパッケージ化し、名前を付け、バージョン管理する方法を知っていると便利です。As .NET Core becomes available on more and more platforms, it's useful to learn how to package, name, and version it. そうすることで、パッケージの管理者は、ユーザーの .NET の実行環境に左右されることなく一貫した体験が保証されるようにサポートできます。This way, package maintainers can help ensure a consistent experience no matter where users choose to run .NET. この記事は以下のユーザーに役立ちます。This article is useful for users that are:

  • ソースから .NET Core をビルドしようとしている。Attempting to build .NET Core from source.
  • 結果として生じるレイアウトまたは生成されるパッケージに影響する可能性がある .NET Core CLI に変更を加えたい。Wanting to make changes to the .NET Core CLI that could impact the resulting layout or packages produced.

ディスク レイアウトDisk layout

インストールした .NET Core は複数のコンポーネントで構成されています。コンポーネントは、ファイルシステムで次のようにレイアウトされています。When installed, .NET Core consists of several components that are laid out as follows in the filesystem:

{dotnet_root}                                     (*)
├── dotnet                       (1)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   ├── <sdk version>            (3)
│   └── NuGetFallbackFolder      (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)
├── 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)
  • (1) dotnet ホスト (別名 "muxer (マルチプレクサー)") には 2 つの異なるロールがあります。アプリケーションを起動するランタイムのアクティブ化と、コマンドをディスパッチする SDK のアクティブ化です。(1) dotnet The host (also known as the "muxer") has two distinct roles: activate a runtime to launch an application, and activate an SDK to dispatch commands to it. ホストはネイティブの実行可能ファイルです (dotnet.exe)。The host is a native executable (dotnet.exe).

ホストは 1 つですが、他のコンポーネントのほとんどはバージョン管理されたディレクトリに入っています (2、3、5、6)。While there's a single host, most of the other components are in versioned directories (2,3,5,6). つまり、複数のバージョンが並列インストールされるので、それらをシステム上に置くことができます。This means multiple versions can be present on the system since they're installed side by side.

  • (2) host/fxr/<fxr バージョン> には、ホストが使用するフレームワーク解決ロジックが含まれます。(2) host/fxr/<fxr version> contains the framework resolution logic used by the host. ホストでは、インストールされている最新の hostfxr が使用されます。The host uses the latest hostfxr that is installed. hostfxr は、.NET Core アプリケーションの実行時に適切なランタイムを選択する役割を担います。The hostfxr is responsible for selecting the appropriate runtime when executing a .NET Core application. たとえば、.NET Core 2.0.0 用としてビルドされたアプリケーションは、2.0.5 が利用できればそれを利用します。For example, an application built for .NET Core 2.0.0 uses the 2.0.5 runtime when it's available. 同様に、hostfxr は開発中、適切な SDK を選択します。Similarly, hostfxr selects the appropriate SDK during development.

  • (3) sdk/<sdk バージョン> SDK (別名 "ツール") は、.NET Core のライブラリやアプリケーションを記述し、ビルドするために使用されるマネージド ツールのセットです。(3) sdk/<sdk version> The SDK (also known as "the tooling") is a set of managed tools that are used to write and build .NET Core libraries and applications. SDK には、.NET Core CLI、マネージ言語コンパイラ、MSBuild、関連するビルド タスクとターゲット、NuGet、新しいプロジェクト テンプレートなどが含まれています。The SDK includes the .NET Core CLI, the managed languages compilers, MSBuild, and associated build tasks and targets, NuGet, new project templates, and so on.

  • (4) sdk/NuGetFallbackFolder には、dotnet restoredotnet build の実行時など、復元操作中に SDK によって使用される NuGet パッケージのキャッシュが含まれています。(4) sdk/NuGetFallbackFolder contains a cache of NuGet packages used by an SDK during the restore operation, such as when running dotnet restore or dotnet build. このフォルダーは、.NET Core 3.0 より前でのみ使用されます。This folder is only used prior to .NET Core 3.0. nuget.org からの構築済みのバイナリ アセットを含むため、ソースから作成することはできません。It can't be built from source, because it contains prebuilt binary assets from nuget.org.

共有フォルダーには、フレームワークが含まれています。The shared folder contains frameworks. 共有フレームワークは、さまざまなアプリケーションで利用できるように、中央の場所で一連のライブラリを提供します。A shared framework provides a set of libraries at a central location so they can be used by different applications.

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

  • (6) shared/Microsoft.AspNetCore.{App,All}/<aspnetcore バージョン> には、ASP.NET Core ライブラリが含まれます。(6) shared/Microsoft.AspNetCore.{App,All}/<aspnetcore version> contains the ASP.NET Core libraries. Microsoft.AspNetCore.App の下にあるライブラリは、.NET Core プロジェクトの一部として開発され、サポートされています。The libraries under Microsoft.AspNetCore.App are developed and supported as part of the .NET Core project. Microsoft.AspNetCore.All の下にあるライブラリは、サードパーティ製ライブラリも含まれるスーパーセットです。The libraries under Microsoft.AspNetCore.All are a superset that also contains third-party libraries.

  • (7) shared/Microsoft.Desktop.App/<デスクトップ アプリ バージョン> には、Windows デスクトップ ライブラリが含まれます。(7) shared/Microsoft.Desktop.App/<desktop app version> contains the Windows desktop libraries. これは、Windows 以外のプラットフォームには含まれていません。This isn't included on non-Windows platforms.

  • (8) LICENSE.txt、ThirdPartyNotices.txt は、それぞれ .NET Core ライセンスと、.NET Core で利用されるサードパーティ ライブラリのライセンスです。(8) LICENSE.txt,ThirdPartyNotices.txt are the .NET Core license and licenses of third-party libraries used in .NET Core, respectively.

  • (9,10) dotnet.1.gz、dotnet dotnet.1.gz は dotnet のマニュアル ページです。(9,10) dotnet.1.gz, dotnet dotnet.1.gz is the dotnet manual page. dotnet は dotnet host(1) のシンボリック リンクです。dotnet is a symlink to the dotnet host(1). これらのファイルは、システム統合のために、よく知られている場所にインストールされます。These files are installed at well-known locations for system integration.

  • (11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref には、.NET Core と ASP.NET Core のそれぞれの x.y バージョンの API が記述されています。(11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref describe the API of an x.y version of .NET Core and ASP.NET Core respectively. これらのパックは、それのターゲット バージョンのコンパイル時に使用されます。These packs are used when compiling for those target versions.

  • (13) Microsoft.NETCore.App.Host.<rid> には、プラットフォーム rid のネイティブ バイナリが含まれます。(13) Microsoft.NETCore.App.Host.<rid> contains a native binary for platform rid. このバイナリは、.NET Core アプリケーションをそのプラットフォームのネイティブ バイナリにコンパイルするときのテンプレートです。This binary is a template when compiling a .NET Core application into a native binary for that platform.

  • (14) Microsoft.WindowsDesktop.App.Ref には、Windows Desktop アプリケーションの x.y バージョンの API が記述されています。(14) Microsoft.WindowsDesktop.App.Ref describes the API of x.y version of Windows Desktop applications. これらのファイルは、そのターゲットに対してコンパイルする場合に使用されます。These files are used when compiling for that target. これは、Windows 以外のプラットフォームにはありません。This isn't provided on non-Windows platforms.

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

  • (16) /etc/dotnet/install_location は、{dotnet_root} の完全なパスを含むファイルです。(16) /etc/dotnet/install_location is a file that contains the full path for {dotnet_root}. パスの末尾は改行文字である場合があります。The path may end with a newline. ルートが /usr/share/dotnet の場合は、このファイルを追加する必要はありません。It's not necessary to add this file when the root is /usr/share/dotnet.

  • (17) templates には、SDK で使用されるテンプレートが含まれます。(17) templates contains the templates used by the SDK. たとえば、dotnet new はここからプロジェクト テンプレートを検索します。For example, dotnet new finds project templates here.

(*) でマークされたフォルダーは、複数のパッケージによって使用されます。The folders marked with (*) are used by multiple packages. 一部のパッケージ形式 (たとえば、rpm) では、このようなフォルダーを特別に処理する必要があります。Some package formats (for example, rpm) require special handling of such folders. パッケージのメンテナンス担当者は、このことに対処する必要があります。The package maintainer must take care of this.

.NET Core バージョン管理は、ランタイム コンポーネント [major].[minor] バージョン番号に基づきます。.NET Core versioning is based on the runtime component [major].[minor] version numbers. SDK バージョンは同じ [major].[minor] を利用し、SDK の機能とパッチ意味論を結合する非依存の [patch] が与えられます。The SDK version uses the same [major].[minor] and has an independent [patch] that combines feature and patch semantics for the SDK. 次に例を示します。SDK バージョン 2.2.302 は、2.2 ランタイム対応の SDK の第 3 機能リリースの第 2 パッチ リリースです。For example: SDK version 2.2.302 is the second patch release of the third feature release of the SDK that supports the 2.2 runtime. バージョン管理のしくみの詳細については、.NET Core のバージョン管理の概要に関する記事を参照してください。For more information about how versioning works, see .NET Core versioning overview.

パッケージには、その名前にバージョン番号の一部が含まれているものもあります。Some of the packages include part of the version number in their name. それによって、特定のバージョンをインストールすることができます。This allows you to install a specific version. バージョンの残りの部分はバージョン名には含まれていません。The rest of the version isn't included in the version name. それによって、OS パッケージ マネージャーはパッケージを更新できます (セキュリティ修正の自動インストールなど)。This allows the OS package manager to update the packages (for example, automatically installing security fixes). サポートされるパッケージ マネージャーは Linux 固有です。Supported package managers are Linux specific.

推奨するパッケージを、以下に示します。The following lists the recommended packages:

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

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 例: dotnet-sdk-2.1Example: dotnet-sdk-2.1
    • 内容: (3),(4)Contains: (3),(4)
    • 依存関係: 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]Dependencies: 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-runtime-[major].[minor] - Installs a specific ASP.NET Core runtime

    • バージョン: <aspnetcore ランタイム バージョン>Version: <aspnetcore runtime version>
    • 例: aspnetcore-runtime-2.1Example: aspnetcore-runtime-2.1
    • 内容: (6)Contains: (6)
    • 依存関係: dotnet-runtime-[major].[minor]Dependencies: dotnet-runtime-[major].[minor]
  • dotnet-runtime-deps-[major].[minor] (省略可能) : 自己完結型アプリケーションを実行する依存関係をインストールしますdotnet-runtime-deps-[major].[minor] (Optional) - Installs the dependencies for running self-contained applications

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

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 例: dotnet-runtime-2.1Example: dotnet-runtime-2.1
    • 内容: (5)Contains: (5)
    • 依存関係: dotnet-hostfxr-[major].[minor], dotnet-runtime-deps-[major].[minor]Dependencies: dotnet-hostfxr-[major].[minor], dotnet-runtime-deps-[major].[minor]
  • dotnet-hostfxr-[major].[minor]: 依存関係dotnet-hostfxr-[major].[minor] - dependency

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 例: dotnet-hostfxr-3.0Example: dotnet-hostfxr-3.0
    • 内容: (2)Contains: (2)
    • 依存関係: dotnet-hostDependencies: dotnet-host
  • dotnet-host: 依存関係dotnet-host - dependency

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 例: dotnet-hostExample: dotnet-host
    • 内容: (1)、(8)、(9)、(10)、(16)Contains: (1),(8),(9),(10),(16)
  • dotnet-apphost-pack-[major].[minor]: 依存関係dotnet-apphost-pack-[major].[minor] - dependency

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 内容: (13)Contains: (13)
  • dotnet-targeting-pack-[major].[minor]: 最新ではないランタイムを対象にできますdotnet-targeting-pack-[major].[minor] - Allows targeting a non-latest runtime

    • バージョン: <ランタイム バージョン>Version: <runtime version>
    • 内容: (12)Contains: (12)
  • aspnetcore-targeting-pack-[major].[minor]: 最新ではないランタイムを対象にできますaspnetcore-targeting-pack-[major].[minor] - Allows targeting a non-latest runtime

    • バージョン: <aspnetcore ランタイム バージョン>Version: <aspnetcore runtime version>
    • 内容: (11)Contains: (11)
  • netstandard-targeting-pack-[netstandard_major].[netstandard_minor]: netstandard バージョンを対象にできますnetstandard-targeting-pack-[netstandard_major].[netstandard_minor] - Allows targeting a netstandard version

    • バージョン: <sdk バージョン>Version: <sdk version>
    • 内容: (15)Contains: (15)
  • dotnet-templates-[major].[minor]

    • バージョン: <sdk バージョン>Version: <sdk version>
    • 内容: (15)Contains: (15)

dotnet-runtime-deps-[major].[minor] では、_ディストリビューション固有の依存関係_を理解している必要があります。The dotnet-runtime-deps-[major].[minor] requires understanding the distro-specific dependencies. ディストリビューションのビルド システムは、これを自動的に得ることができる可能性があるため、このパッケージは省略可能です。これらの場合、これらの依存関係は dotnet-runtime-[major].[minor] パッケージに直接追加されます。Because the distro build system may be able to derive this automatically, the package is optional, in which case these dependencies are added directly to the dotnet-runtime-[major].[minor] package.

パッケージの内容がバージョン付きフォルダーにある場合、[major].[minor] のパッケージ名はバージョン付きのフォルダー名と同じになります。When package content is under a versioned folder, the package name [major].[minor] match the versioned folder name. netstandard-targeting-pack-[netstandard_major].[netstandard_minor] を除くすべてのパッケージでは、これは .NET Core バージョンとも同じになります。For all packages, except the netstandard-targeting-pack-[netstandard_major].[netstandard_minor], this also matches with the .NET Core version.

パッケージ間の依存関係では、バージョン要件_以上_を使用する必要があります。Dependencies between packages should use an equal or greater than version requirement. たとえば、dotnet-sdk-2.2:2.2.401 には aspnetcore-runtime-2.2 >= 2.2.6 が必要です。For example, dotnet-sdk-2.2:2.2.401 requires aspnetcore-runtime-2.2 >= 2.2.6. これにより、ユーザーはルート パッケージ (たとえば、dnf update dotnet-sdk-2.2) を使用してインストールをアップグレードできます。This makes it possible for the user to upgrade their installation via a root package (for example, dnf update dotnet-sdk-2.2).

ほとんどのディストリビューションで、ソースからビルドするすべての成果物を必要とします。Most distributions require all artifacts to be built from source. これはパッケージにいくつかの影響を与えます。This has some impact on the packages:

  • shared/Microsoft.AspNetCore.All の下にあるサードパーティ製ライブラリは、ソースから簡単にビルドできません。The third-party libraries under shared/Microsoft.AspNetCore.All can't be easily built from source. そのため、そのフォルダーは aspnetcore-runtime パッケージから除外されます。So that folder is omitted from the aspnetcore-runtime package.

  • NuGetFallbackFoldernuget.org からバイナリ成果物を利用して入力されます。The NuGetFallbackFolder is populated using binary artifacts from nuget.org. 空のままにしてください。It should remain empty.

複数の dotnet-sdk パッケージで NuGetFallbackFolder に同じファイルが提供されることがあります。Multiple dotnet-sdk packages may provide the same files for the NuGetFallbackFolder. パッケージ マネージャーの問題を回避するには、これらのファイルを同じにします (チェックサム、変更日など)。To avoid issues with the package manager, these files should be identical (checksum, modification date, and so on).

パッケージをビルドするBuilding packages

dotnet/source-build リポジトリには、.NET Core SDK のソース ターボールとそのすべてのコンポーネントをビルドする方法があります。The dotnet/source-build repository provides instructions on how to build a source tarball of the .NET Core SDK and all its components. この source-build リポジトリの出力は、この記事の最初のセクションで説明したレイアウトに一致します。The output of the source-build repository matches the layout described in the first section of this article.