Packages, métapackages et frameworksPackages, metapackages and frameworks

.NET Core est une plateforme constituée de packages NuGet..NET Core is a platform made of NuGet packages. Certains produits bénéficient d’une définition de packages très précise, d’autres d’une définition plus grossière.Some product experiences benefit from fine-grained definition of packages while others from coarse-grained. Pour prendre en compte cette dualité, le produit est distribué sous forme d’un ensemble précis de packages, ainsi qu’en blocs plus grossiers avec un type de package simplement appelé métapackage.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.

Chaque package .NET Core peut être exécuté sur plusieurs implémentations de .NET, représentées par des frameworks.Each of the .NET Core packages support being run on multiple .NET implementations, represented as frameworks. Certains d’entre eux sont des frameworks classiques, comme net46, représentant le .NET Framework.Some of those frameworks are traditional frameworks, like net46, representing the .NET Framework. D’autres sont de nouveaux frameworks qui peuvent s’envisager comme des « frameworks basés sur des packages », qui établissent un nouveau modèle de définition de frameworks.Another set is new frameworks that can be thought of as "package-based frameworks", which establish a new model for defining frameworks. Ces frameworks basés sur des packages sont entièrement formés et définis comme packages, formant ainsi une relation forte entre les packages et les frameworks.These package-based frameworks are entirely formed and defined as packages, forming a strong relationship between packages and frameworks.

PackagesPackages

.NET Core se divise en un ensemble de packages qui fournissent des primitives, des types de données généraux, des types de composition d’applications et des utilitaires communs..NET Core is split into a set of packages, which provide primitives, higher-level data types, app composition types and common utilities. Chacun de ces packages représente un assembly unique de même nom.Each of these packages represent a single assembly of the same name. Par exemple, System.Runtime contient System.Runtime.dll.For example, System.Runtime contains System.Runtime.dll.

Il y a des avantages à définir les packages avec précision :There are advantages to defining packages in a fine-grained manner:

  • Les packages définis avec précision peuvent être émis selon un calendrier qui leur est propre en ayant relativement peu testé d’autres packages.Fine-grained packages can ship on their own schedule with relatively limited testing of other packages.
  • Ils peuvent offrir une prise en charge de systèmes d’exploitation et de processeurs différents.Fine-grained packages can provide differing OS and CPU support.
  • Ils peuvent avoir des dépendances spécifiques à une seule bibliothèque.Fine-grained packages can have dependencies specific to only one library.
  • Les applications sont plus petites, car les packages non référencés ne sont pas distribués avec elles.Apps are smaller because unreferenced packages don't become part of the app distribution.

Certains de ces avantages ne sont profitables que dans certaines circonstances.Some of these benefits are only used in certain circumstances. Par exemple, les packages .NET Core sont généralement émis selon le même calendrier avec la même prise en charge de plateforme.For example, NET Core packages will typically ship on the same schedule with the same platform support. Dans le cas de la maintenance, des correctifs peuvent être distribués et installés sous forme de petites mises à jour de package uniques.In the case of servicing, fixes can be distributed and installed as small single package updates. En raison de la portée limitée des modifications, la validation et le délai de mise à disposition d’un correctif sont limitées au strict nécessaire pour une même bibliothèque.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.

Voici la liste des principaux packages NuGet pour .NET Core :The following is a list of the key NuGet packages for .NET Core:

En règle générale, il est plus facile et plus robuste d’inclure un métapackage que chacun des packages.Typically, rather than including each package, it's easier and more robust to include a metapackage. Toutefois, si vous avez besoin d’un seul package, vous pouvez l’ajouter de la même manière que dans l’exemple suivant, qui fait référence au package 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>

MétapackagesMetapackages

Les métapackages sont une convention de packages NuGet qui vise à décrire un ensemble de packages qu’il est logique de regrouper.Metapackages are a NuGet package convention for describing a set of packages that are meaningful together. Ils représentent cet ensemble de packages sous forme de dépendances.They represent this set of packages by making them dependencies. Ils peuvent éventuellement établir un cadre pour cet ensemble de packages en spécifiant un framework.They can optionally establish a framework for this set of packages by specifying a framework.

Les versions précédentes des outils .NET Core (les outils project.json et csproj) spécifiaient par défaut un framework et un métapackage.Previous versions of the .NET Core tools (both project.json and csproj-based tools) by default specified both a framework and a metapackage. Actuellement, toutefois, le métapackage est implicitement référencé par le framework cible, de sorte que chaque métapackage est lié à un framework cible.Currently, however, the metapackage is implicitly referenced by the target framework, so that each metapackage is tied to a target framework. Par exemple, le framework netstandard1.6 référence le métapackage NetStandard.Library version 1.6.0.For example, the netstandard1.6 framework references the NetStandard.Library version 1.6.0 metapackage. De même, le framework netcoreapp2.1 référence le métapackage Microsoft.NETCore.App version 2.1.0.Similarly, the netcoreapp2.1 framework references the Microsoft.NETCore.App Version 2.1.0 metapackage. Pour plus d’informations, consultez Implicit metapackage package reference in the .NET Core SDK (Référence de package métapackage implicite dans le SDK .NET Core).For more information, see Implicit metapackage package reference in the .NET Core SDK.

En ciblant un framework et en référençant implicitement un métapackage, vous ajoutez une référence à chacun de ses packages dépendants en une seule fois.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. De cette façon, toutes les bibliothèques contenues dans ces packages sont disponibles pour IntelliSense (ou une expérience similaire) et pour la publication de votre application.That makes all of the libraries in those packages available for IntelliSense (or similar experience) and for publishing your app.

L’utilisation de métapackages confère les avantages suivants :There are advantages to using metapackages:

  • Fournit une expérience utilisateur pratique pour référencer un ensemble étoffé de packages définis avec précision.Provides a convenient user experience to reference a large set of fine-grained packages.
  • Définit un ensemble de packages (comprenant des versions spécifiques) qui ont été testés et fonctionnent bien ensemble.Defines a set of packages (including specific versions) that are tested and work well together.

Le métapackage .NET Standard est le suivant :The .NET Standard metapackage is:

  • NETStandard.Library : décrit les bibliothèques qui font partie de « .NET Standard ».NETStandard.Library - Describes the libraries that are part of the ".NET Standard". S’applique à toutes les implémentations .NET (par exemple, .NET Framework, .NET Core et Mono) qui prennent en charge .NET Standard.Applies to all .NET implementations (for example, .NET Framework, .NET Core and Mono) that support .NET Standard. Établit le framework « netstandard ».Establishes the 'netstandard' framework.

Les principaux métapackages .NET Core sont les suivants :The key .NET Core metapackages are:

FrameworksFrameworks

Chaque package .NET Core prend en charge un ensemble de frameworks de runtime..NET Core packages each support a set of runtime frameworks. Les frameworks décrivent un ensemble d’API disponibles (et éventuellement d’autres caractéristiques) sur lesquelles vous pouvez vous appuyer quand vous ciblez un framework donné.Frameworks describe an available API set (and potentially other characteristics) that you can rely on when you target a given framework. Leur version change à mesure que de nouvelles API sont ajoutés.They are versioned as new APIs are added.

Par exemple, System.IO.FileSystem prend en charge les frameworks suivants :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 plateformes Xamarin (par exemple, xamarinios10)6 Xamarin platforms (for example, xamarinios10)

Il est utile de comparer les deux premiers frameworks, car ils représentent des exemples des deux manières de définir des frameworks.It is useful to contrast the first two of these frameworks, since they are examples of the two different ways that frameworks are defined.

Le framework .NETFramework,Version=4.6 représente les API disponibles dans le .NET Framework 4.6.The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. Vous pouvez produire des bibliothèques compilées avec les assemblys de référence du .NET Framework 4.6, puis distribuer ces bibliothèques dans des packages NuGet dans un dossier lib net46.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. Elle servira aux applications qui ciblent le .NET Framework 4.6 ou qui sont compatibles avec celui-ci.It will be used for apps that target the .NET Framework 4.6 or that are compatible with it. C’est ainsi que l’ensemble des frameworks fonctionne habituellement.This is how all frameworks have traditionally worked.

.NETStandard,Version=1.3 est un framework basé sur des packages.The .NETStandard,Version=1.3 framework is a package-based framework. Il s’appuie sur des packages qui ciblent le framework pour définir et exposer des interfaces API selon le framework.It relies on packages that target the framework to define and expose APIs in terms of the framework.

Frameworks basés sur des packagesPackage-based frameworks

Il existe une relation réciproque entre les frameworks et les packages.There is a two-way relationship between frameworks and packages. La première partie consiste à définir les API accessibles à un framework donné, par exemple netstandard1.3.The first part is defining the APIs available for a given framework, for example netstandard1.3. Les packages qui ciblent netstandard1.3 (ou des frameworks compatibles tels que netstandard1.0) définissent les API disponibles pour netstandard1.3.Packages that target netstandard1.3 (or compatible frameworks, like netstandard1.0) define the APIs available for netstandard1.3. On pourrait croire à première vue qu’il s’agit d’une définition circulaire, mais il n’en est rien.That may sound like a circular definition, but it isn't. Étant « basée sur des packages », la définition d’API pour le framework est issue de packages.By virtue of being "package-based", the API definition for the framework comes from packages. Le framework lui-même ne définit pas d’API.The framework itself doesn't define any APIs.

La deuxième partie de la relation est la sélection de ressource.The second part of the relationship is asset selection. Les packages peuvent contenir des ressources pour plusieurs frameworks.Packages can contain assets for multiple frameworks. Le framework est nécessaire pour déterminer quelle ressource sélectionner, par exemple net46 ou netstandard1.3, pour une référence donnée à un ensemble de packages et/ou de métapackages.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. Il est important de sélectionner la ressource adéquate.It is important to select the correct asset. Par exemple, il est peu probable qu’une ressource net46 soit compatible avec le .NET Framework 4.0 ou .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.

Cette relation est illustrée dans l’image suivante.You can see this relationship in the following image. L’API cible et définit le framework.The API targets and defines the framework. Le framework est utilisé pour la sélection de ressource.The framework is used for asset selection. La ressource vous fournit l’API.The asset gives you the API.

Composition d’un framework basé sur des packages

Les deux principaux frameworks basés sur des packages utilisés avec .NET Core sont les suivants :The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET Standard.NET Standard

Le framework .NET Standard (moniker de framework cible : netstandard) représente les API définies par et créées sur le framework .NET Standard.The .NET Standard (Target Framework Moniker: netstandard) framework represents the APIs defined by and built on top of the .NET Standard. Les bibliothèques destinées à s’exécuter sur plusieurs runtimes doivent cibler ce framework.Libraries that are intended to run on multiple runtimes should target this framework. Elles sont prises en charge sur n’importe quel runtime compatible .NET Standard, tels que .NET Core, .NET Framework et Mono/Xamarin.They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. Chacun de ces runtimes prend en charge un ensemble de versions .NET Standard, selon les API qu’ils implémentent.Each of these runtimes supports a set of .NET Standard versions, depending on which APIs they implement.

L’infrastructure netstandard référence implicitement le métapackage NETStandard.Library.The netstandard framework implicitly references the NETStandard.Library metapackage. Par exemple, le fichier projet MSBuild suivant indique que le projet cible netstandard1.6, qui référence le métapackage NETStandard.Library version 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>

Toutefois, les références de framework et de métapackage dans le fichier projet ne doivent pas nécessairement correspondre et vous pouvez utiliser l’élément <NetStandardImplicitPackageVersion> dans votre fichier projet pour spécifier une version de framework inférieure à la version de métapackage.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. Par exemple, le fichier projet suivant est valide.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>

Il peut sembler étrange de cibler netstandard1.3, mais d’utiliser la version 1.6.0 de NETStandard.Library.It may seem strange to target netstandard1.3 but use the 1.6.0 version of NETStandard.Library. Il s’agit d’un cas d’utilisation valide, car le métapackage maintient la prise en charge pour les anciennes versions de netstandard.It is a valid use-case, since the metapackage maintains support for older netstandard versions. Vous pouvez avoir procédé à une uniformisation sur la version 1.6.0 du métapackage et l’utiliser pour toutes vos bibliothèques, qui ciblent diverses versions de 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. Avec cette approche, vous avez seulement besoin de restaurer NETStandard.Library 1.6.0 et pas les versions antérieures.With this approach, you only need to restore NETStandard.Library 1.6.0 and not earlier versions.

L’inverse ne serait pas valide : le ciblage de netstandard1.6 avec la version 1.3.0 de NETStandard.Library.The reverse would not be valid: targeting netstandard1.6 with the 1.3.0 version of NETStandard.Library. Vous ne pouvez pas cibler un framework de version supérieure avec un métapackage de version inférieure, car ce dernier n’expose aucune ressource pour le framework de version supérieure.You cannot target a higher framework with a lower metapackage, since the lower version metapackage will not expose any assets for that higher framework. Le schéma de gestion de version des métapackages certifie que les métapackages correspondent à la version la plus récente du framework qu’ils décrivent.The versioning scheme for metapackages asserts that metapackages match the highest version of the framework they describe. Grâce au schéma de gestion de version, la première version de NETStandard.Library est v1.6.0, étant donné qu’elle contient des ressources netstandard1.6.By virtue of the versioning scheme, the first version of NETStandard.Library is v1.6.0 given that it contains netstandard1.6 assets. La version 1.3.0 est utilisée dans l’exemple ci-dessus dans un souci de symétrie par rapport à l’exemple précédent, mais elle n’existe pas dans la réalité.v1.3.0 is used in the example above, for symmetry with the example above, but does not actually exist.

Application .NET Core.NET Core application

Le framework .NET Core (moniker de framework cible : netcoreapp) représente les packages et les API associées qui accompagnent la distribution .NET Core et le modèle d’application console qu’elle propose.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. Les applications .NET Core doivent utiliser ce framework, en raison du ciblage du modèle d’application console, tout comme les bibliothèques destinées à s’exécuter uniquement sur .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. L’utilisation de ce framework contraint les applications et les bibliothèques à s’exécuter uniquement sur .NET Core.Using this framework restricts apps and libraries to running only on .NET Core.

Le métapackage Microsoft.NETCore.App cible le framework netcoreapp.The Microsoft.NETCore.App metapackage targets the netcoreapp framework. Il donne accès à une soixantaine de bibliothèques, dont une quarantaine est fournie par le package NETStandard.Library, à laquelle s’ajoute une vingtaine de bibliothèques supplémentaires.It provides access to ~60 libraries, ~40 provided by the NETStandard.Library package and ~20 more in addition. Vous pouvez référencer des bibliothèques supplémentaires qui ciblent netcoreapp ou des frameworks compatibles, telles que netstandard, pour avoir accès à des API supplémentaires.You can reference additional libraries that target netcoreapp or compatible frameworks, such as netstandard, to get access to additional APIs.

La plupart des bibliothèques supplémentaires fournies par Microsoft.NETCore.App ciblent aussi netstandard, vu que leurs dépendances sont satisfaites par d’autres bibliothèques netstandard.Most of the additional libraries provided by Microsoft.NETCore.App also target netstandard given that their dependencies are satisfied by other netstandard libraries. Cela signifie que les bibliothèques netstandard peuvent aussi référencer ces packages comme dépendances.That means that netstandard libraries can also reference those packages as dependencies.