パッケージ、メタパッケージ、フレームワークPackages, metapackages and frameworks

.NET Core は、NuGet パッケージで作成されたプラットフォームです。.NET Core is a platform made of NuGet packages. 製品のエクスペリエンスには、粒度の細かいパッケージの定義から恩恵を受けるものもあれば、粒度の粗いパッケージの定義から恩恵を受けるものもあります。Some product experiences benefit from fine-grained definition of packages while others from coarse-grained. この二重性に対応するために、製品は、粒度の細かいパッケージ セットとして配布され、かつ、俗にメタパッケージと呼ばれるパッケージの種類を使用して粒度の粗いチャンク単位で配布されます。To accommodate this duality, the product is distributed as a fine-grained set of packages and in coarser chunks with a package type informally called a metapackage.

各 .NET Core パッケージは、フレームワークとして表現される、複数の .NET 実装での実行に対応しています。Each of the .NET Core packages support being run on multiple .NET implementations, represented as frameworks. このようなフレームワークには、net46 (.NET Framework に相当する) のような従来のフレームワークもあれば、Some of those frameworks are traditional frameworks, like net46, representing the .NET Framework. フレームワークを定義するために新しいモデルを確立し、"パッケージ ベースのフレームワーク" と見なすことができる新しいフレームワークもあります。Another set is new frameworks that can be thought of as "package-based frameworks", which establish a new model for defining frameworks. パッケージ ベースのフレームワークは、完全にパッケージとして形成および定義されるので、パッケージとフレームワークの間に強力なリレーションシップが形成されます。These package-based frameworks are entirely formed and defined as packages, forming a strong relationship between packages and frameworks.

パッケージPackages

.NET core は、プリミティブ、上位レベルのデータ型、アプリ コンポジション型、および一般的なユーティリティを提供する一連のパッケージに分割されます。.NET Core is split into a set of packages, which provide primitives, higher-level data types, app composition types and common utilities. これらのパッケージはいずれも、同じ名前の単一アセンブリです。Each of these packages represent a single assembly of the same name. たとえば、System.Runtime には、System.Runtime.dll が含まれています。For example, System.Runtime contains System.Runtime.dll.

粒度の細かい方法でパッケージを定義することには、次の利点があります。There are advantages to defining packages in a fine-grained manner:

  • 粒度の細かいパッケージの場合は、ほかのパッケージのテストが比較的に抑えられるので、独自のスケジュールに合わせて配布することができます。Fine-grained packages can ship on their own schedule with relatively limited testing of other packages.
  • 粒度の細かいパッケージでは、さまざまな OS および CPU をサポートできます。Fine-grained packages can provide differing OS and CPU support.
  • 粒度の細かいパッケージは、1 つライブラリのみに固有の依存関係を持つことができます。Fine-grained packages can have dependencies specific to only one library.
  • アプリ配布の対象に未参照のパッケージが含まれないので、アプリのサイズが小さくなります。Apps are smaller because unreferenced packages don't become part of the app distribution.

これらの利点の一部は、特定の状況でのみ使用されます。Some of these benefits are only used in certain circumstances. たとえば、NET Core パッケージは、通常、同じプラットフォーム サポートを使用して、同じスケジュールで配布されます。For example, NET Core packages will typically ship on the same schedule with the same platform support. サポートを行う場合は、修正プログラムをサイズの小さな単一のパッケージ更新プログラムとして配布およびインストールすることができます。In the case of servicing, fixes can be distributed and installed as small single package updates. 変更の範囲が狭いため、検証と修正プログラムを使用できるようにするまでの時間は、単一のライブラリで必要とされる内容に限定されます。Due to the narrow scope of change, the validation and time to make a fix available is limited to what is needed for a single library.

.NET Core 用の主な NuGet パッケージを次に一覧します。The following is a list of the key NuGet packages for .NET Core:

通常、各パッケージを含めるよりメタパッケージを含める方がより簡単であり、より堅牢です。Typically, rather than including each package, it's easier and more robust to include a metapackage. ただし、単一のパッケージが必要な場合、下の例のように追加できます。System.Runtime パッケージを参照しています。However, when you need a single package, you can include it as in the following example, which references the System.Runtime package.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="System.Runtime" Version="4.3.0" />
  </ItemGroup>
</Project>

メタパッケージMetapackages

メタパッケージは、統合して意味をなすパッケージ セットを記述するための NuGet パッケージの規則です。Metapackages are a NuGet package convention for describing a set of packages that are meaningful together. メタパッケージでは、パッケージ間に依存関係を設定して、パッケージ セットを表現します。They represent this set of packages by making them dependencies. メタパッケージでは必要に応じて、フレームワークを指定して、このパッケージ セットのフレームワークを確立することができます。They can optionally establish a framework for this set of packages by specifying a framework.

.NET Core ツールの以前のバージョンは (project.json ツールと csproj-based ツールの両方)、既定では、フレームワークとメタパッケージの両方を指定していました。Previous versions of the .NET Core tools (both project.json and csproj-based tools) by default specified both a framework and a metapackage. ただし、現時点では、各メタパッケージがターゲット フレームワークに関連付けられるように、ターゲット フレームワークによってメタパッケージが暗黙的に参照されます。Currently, however, the metapackage is implicitly referenced by the target framework, so that each metapackage is tied to a target framework. たとえば、netstandard1.6 フレームワークは NetStandard.Library バージョン 1.6.0 メタパッケージを参照します。For example, the netstandard1.6 framework references the NetStandard.Library version 1.6.0 metapackage. 同様に、netcoreapp2.1 フレームワークは Microsoft.NETCore.App バージョン 2.1.0 メタパッケージを参照します。Similarly, the netcoreapp2.1 framework references the Microsoft.NETCore.App Version 2.1.0 metapackage. 詳細については、「Implicit metapackage package reference in the .NET Core SDK」 (.NET Core SDK のメタパッケージの暗黙的パッケージ参照) を参照してください。For more information, see Implicit metapackage package reference in the .NET Core SDK.

フレームワークをターゲットにし、メタパッケージを暗黙的に参照することは、各依存パッケージの参照を 1 つのジェスチャとして追加することを実質的に意味します。Targeting a framework and implicitly referencing a metapackage means that you in effect are adding a reference to each of its dependent packages as a single gesture. これらのパッケージのライブラリはすべて、IntelliSense (または同様のエクスペリエンス) とアプリの公開で利用できます。That makes all of the libraries in those packages available for IntelliSense (or similar experience) and for publishing your app.

メタパッケージを使用する利点は次のとおりです。There are advantages to using metapackages:

  • 一連の粒度の細かいパッケージを参照するのに便利なユーザー エクスペリエンスを提供できます。Provides a convenient user experience to reference a large set of fine-grained packages.
  • テストされ一体となって優れた機能を発揮するパッケージ セット (特定のバージョンを含む) を定義できます。Defines a set of packages (including specific versions) that are tested and work well together.

.NET Standard のメタパッケージ:The .NET Standard metapackage is:

  • NETStandard.Library - ".NET Standard" に含まれるライブラリを記述したものです。NETStandard.Library - Describes the libraries that are part of the ".NET Standard". .NET Standard をサポートするすべての .NET 実装 (.NET Framework、.NET Core および Mono など) に適用されます。Applies to all .NET implementations (for example, .NET Framework, .NET Core and Mono) that support .NET Standard. "netstandard" フレームワークを確立します。Establishes the 'netstandard' framework.

主な .NET Core メタパッケージ:The key .NET Core metapackages are:

フレームワークFrameworks

.NET Core の各パッケージでは、一連のランタイム フレームワークがサポートされます。.NET Core packages each support a set of runtime frameworks. フレームワークでは、特定のフレームワークを対象とするときに依存することができる使用可能な API セット (および、場合によってはその他の特性) について記述します。Frameworks describe an available API set (and potentially other characteristics) that you can rely on when you target a given framework. フレームワークのバージョンは、新しい API が追加されると更新されます。They are versioned as new APIs are added.

たとえば、 System.IO.FileSystem では、次のフレームワークをサポートします。For example, System.IO.FileSystem supports the following frameworks:

  • .NETFramework,Version=4.6.NETFramework,Version=4.6
  • .NETStandard,Version=1.3.NETStandard,Version=1.3
  • 6 Xamarin プラットフォーム (xamarinios10 など)6 Xamarin platforms (for example, xamarinios10)

上記フレームワークの最初の 2 つの例は、フレームワークの 2 種類の定義方法を示したものであるので、この 2 つを比べることには意義があります。It is useful to contrast the first two of these frameworks, since they are examples of the two different ways that frameworks are defined.

.NETFramework,Version=4.6 フレームワークは、.NET Framework 4.6 で使用できる API を表します。The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. .NET Framework 4.6 参照アセンブリでコンパイルされたライブラリを生成し、NuGet パッケージの net46 lib フォルダーに置かれているそれらのライブラリを配布することができます。You can produce libraries compiled with the .NET Framework 4.6 reference assemblies and then distribute those libraries in NuGet packages in a net46 lib folder. このフレームワークは、.NET Framework 4.6 を対象とするアプリ、または .NET Framework 4.6 と互換性のあるアプリで使用されます。It will be used for apps that target the .NET Framework 4.6 or that are compatible with it. これは、すべてのフレームワークの従来のしくみです。This is how all frameworks have traditionally worked.

.NETStandard,Version=1.3 フレームワークは、パッケージ ベースのフレームワークです。The .NETStandard,Version=1.3 framework is a package-based framework. これは、フレームワークに関して API を定義して公開するためにフレームワークを対象とするパッケージに依存します。It relies on packages that target the framework to define and expose APIs in terms of the framework.

パッケージ ベースのフレームワークPackage-based frameworks

フレームワークとパッケージの間には双方向のリレーションシップがあります。There is a two-way relationship between frameworks and packages. リレーションシップの 1 番目の部分は、特定のフレームワーク (netstandard1.3 など) で使用可能な API を定義することです。The first part is defining the APIs available for a given framework, for example netstandard1.3. netstandard1.3 (またはnetstandard1.0 のような互換性のあるフレームワーク) を対象とするパッケージは、netstandard1.3 で使用可能な API を定義します。Packages that target netstandard1.3 (or compatible frameworks, like netstandard1.0) define the APIs available for netstandard1.3. 循環定義のように思われるかもしれませんが、そうではありません。That may sound like a circular definition, but it isn't. "パッケージ ベース" であるため、フレームワークの API 定義は、パッケージから取得されます。By virtue of being "package-based", the API definition for the framework comes from packages. フレームワーク自体で、API の定義は行われません。The framework itself doesn't define any APIs.

リレーションシップの 2 番目の部分は、資産の選択です。The second part of the relationship is asset selection. パッケージには、複数のフレームワークの資産を含めることができます。Packages can contain assets for multiple frameworks. パッケージ セットおよび/またはメタパッケージ セットへの参照を指定する場合は、選択すべき資産 (たとえば、net46 または netstandard1.3) を決定するためにフレームワークが必要です。Given a reference to a set of packages and/or metapackages, the framework is needed to determine which asset should be selected, for example net46 or netstandard1.3. 正しい資産を選択することが重要です。It is important to select the correct asset. たとえば、net46 資産が .NET Framework 4.0 または .NET Core 1.0 と互換性を持たない可能性があります。For example, a net46 asset is not likely to be compatible with .NET Framework 4.0 or .NET Core 1.0.

このリレーションシップは次の図のようになります。You can see this relationship in the following image. API は、フレームワークを対象とし、定義します。The API targets and defines the framework. フレームワークは、資産の選択で使用されます。The framework is used for asset selection. 資産 は、API を提供します。The asset gives you the API.

パッケージ ベースのフレームワークのコンポジション

.NET Core では、次の 2 つのパッケージ ベースのプライマリ フレームワークが使用されます。The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET Standard.NET Standard

.NET Standard (ターゲット フレームワーク モニカー: netstandard) フレームワークは、.NET Standard によって定義され、.NET Standard の上に構築された API を表します。The .NET Standard (Target Framework Moniker: netstandard) framework represents the APIs defined by and built on top of the .NET Standard. 複数のランタイムでの実行を意図したライブラリは、このフレームワークを対象とする必要があります。Libraries that are intended to run on multiple runtimes should target this framework. それらのライブラリは、.NET Core、.NET Framework、Mono/Xamarin など、.NET Standard 準拠のランタイムでサポートされます。They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. このようなランタイムはそれぞれが、実装される API に応じて、一連の .NET Standard バージョンをサポートします。Each of these runtimes supports a set of .NET Standard versions, depending on which APIs they implement.

netstandard フレームワークは NETStandard.Library メタパッケージを暗黙的に参照します。The netstandard framework implicitly references the NETStandard.Library metapackage. たとえば、次の MSBuild プロジェクト ファイルは、プロジェクトが netstandard1.6 をターゲットにすることを示します。これは NETStandard.Library バージョン 1.6 メタパッケージを参照します。For example, the following MSBuild project file indicates that the project targets netstandard1.6, which references the NETStandard.Library version 1.6 metapackage.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>
</Project>

ただし、プロジェクト ファイルのフレームワーク参照とメタパッケージ参照が一致する必要はありません。プロジェクト ファイルの <NetStandardImplicitPackageVersion> 要素を利用し、メタパッケージ バージョンより下のフレームワーク バージョンを指定できます。However, the framework and metapackage references in the project file do not need to match, and you can use the <NetStandardImplicitPackageVersion> element in your project file to specify a framework version that is lower than the metapackage version. たとえば、次のプロジェクト ファイルが有効です。For example, the following project file is valid.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.3</TargetFramework>
    <NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
  </PropertyGroup>
</Project>

netstandard1.3 を対象とするのに NETStandard.Library のバージョン 1.6.0 を使用するのは、奇妙に思えるかもしれません。It may seem strange to target netstandard1.3 but use the 1.6.0 version of NETStandard.Library. これは、メタパッケージでは古い netstandard バージョンのサポートが継続されていることから、使用例として有効です。It is a valid use-case, since the metapackage maintains support for older netstandard versions. メタパッケージのバージョン 1.6.0 が標準とされている状況で、これをすべてのライブラリ (netstandard の各種バージョンを対象とする) で使用する場合が考えられます。It could be the case you've standardized on the 1.6.0 version of the metapackage and use it for all your libraries, which target a variety of netstandard versions. この方法を使用した場合、NETStandard.Library 1.6.0 を復元する必要があるだけで、それより前のバージョンの復元は必要ありません。With this approach, you only need to restore NETStandard.Library 1.6.0 and not earlier versions.

逆は無効になります (netstandard1.6 を対象とするが、NETStandard.Library のバージョン 1.3.0 を使用する)。The reverse would not be valid: targeting netstandard1.6 with the 1.3.0 version of NETStandard.Library. 上位フレームワークと下位メタパッケージの組み合わせを対象とすることはできません。下位バージョンのメタパッケージはその上位フレームワークに対して資産を公開しないことが理由です。You cannot target a higher framework with a lower metapackage, since the lower version metapackage will not expose any assets for that higher framework. メタパッケージのバージョン管理スキームは、メタパッケージが、記述したフレームワークの最上位バージョンと一致することをアサートします。The versioning scheme for metapackages asserts that metapackages match the highest version of the framework they describe. バージョン管理スキームにより、netstandard1.6 資産が含まれている場合、NETStandard.Library の最初のバージョンは v1.6.0 となります。By virtue of the versioning scheme, the first version of NETStandard.Library is v1.6.0 given that it contains netstandard1.6 assets. 上記の例では対称性を考慮して v1.3.0 が使用されていますが、実際には存在しません。v1.3.0 is used in the example above, for symmetry with the example above, but does not actually exist.

.NET Core アプリケーション.NET Core application

.NET Core アプリケーション (ターゲット フレームワーク モニカー: netcoreapp) フレームワークは、.NET Core 配布に付属のパッケージおよび関連する API と、.NET Core 配布によって提供されるコンソール アプリケーション モデルを表します。The .NET Core (Target Framework Moniker: netcoreapp) framework represents the packages and associated APIs that come with the .NET Core distribution and the console application model that it provides. .NET Core アプリは、コンソール アプリケーション モデルを対象とすることから、.NET Core での実行のみを意図するライブラリとして、このフレームワークを使用する必要があります。.NET Core apps must use this framework, due to targeting the console application model, as should libraries that intended to run only on .NET Core. このフレームワークを使用すると、アプリとライブラリは .NET Core でのみの実行に限定されます。Using this framework restricts apps and libraries to running only on .NET Core.

Microsoft.NETCore.App メタパッケージは、netcoreapp フレームワークを対象とします。The Microsoft.NETCore.App metapackage targets the netcoreapp framework. これは、約 60 のライブラリにアクセスできるようにします (約 40 個は NETStandard.Library パッケージによって提供され、さらに約 20 個の追加分)。It provides access to ~60 libraries, ~40 provided by the NETStandard.Library package and ~20 more in addition. netcoreapp または互換性を持つフレームワーク (netstandard など) を対象とする追加のライブラリを参照することで、追加の API にアクセスできます。You can reference additional libraries that target netcoreapp or compatible frameworks, such as netstandard, to get access to additional APIs.

Microsoft.NETCore.App によって提供される追加ライブラリの大部分も、依存関係がほかの netstandard ライブラリによって満足されるならば、netstandard を対象とします。Most of the additional libraries provided by Microsoft.NETCore.App also target netstandard given that their dependencies are satisfied by other netstandard libraries. つまり、netstandard ライブラリは、それらのパッケージを依存関係として参照することもできます。That means that netstandard libraries can also reference those packages as dependencies.