Pakete, Metapakete und FrameworksPackages, Metapackages and Frameworks

.NET Core ist eine Plattform, die aus NuGet-Paketen besteht..NET Core is a platform made of NuGet packages. Einige Produkte profitieren von differenzierten Paketdefinitionen während andere von undifferenzierten profitieren.Some product experiences benefit from fine-grained definition of packages while others from coarse-grained. Um dieser Dualität entgegenzukommen, wird dieses Produkt als eine Gruppe von differenzierten Paketen verteilt und dann in undifferenzierteren Blöcken mit einem Pakettyp beschrieben, der informell als „Metapaket“ bekannt ist.To accommodate this duality, the product is distributed as a fine-grained set of packages and then described in coarser chunks with a package type informally called a "metapackage".

Jedes .NET Core-Paket unterstützt die Ausführung in mehreren als Framework dargestellten .NET-Implementierungen.Each of the .NET Core packages support being run on multiple .NET implementations, represented as frameworks. Einige dieser Frameworks sind traditionelle Frameworks, wie z.B. net46, das das .NET Framework darstellt.Some of those frameworks are traditional frameworks, like net46, representing the .NET Framework. Eine andere Gruppe sind neue Frameworks, die man sich als „paketbasierte Frameworks“ vorstellen kann, die ein neues Modell zum Definieren von Frameworks einführen.Another set is new frameworks that can be thought of as "package-based frameworks", which establish a new model for defining frameworks. Diese paketbasierten Frameworks sind vollständig als Pakete formuliert und definiert, und bilden dadurch eine starke Beziehung zwischen Paketen und Frameworks.These package-based frameworks are entirely formed and defined as packages, forming a strong relationship between packages and frameworks.

PaketePackages

.NET Core ist in verschiedene Pakete aufgeteilt, die Primitive, Datentypen der höheren Ebene, Anwendungskompositionstypen und allgemeine Hilfsprogramme bereitstellen..NET Core is split into a set of packages, which provide primitives, higher-level data types, app composition types and common utilities. Jedes dieser Pakete stellt eine einzelne Assembly mit dem gleichen Namen dar.Each of these packages represent a single assembly of the same name. System.Runtime enthält z.B. System.Runtime.dll.For example, System.Runtime contains System.Runtime.dll.

Es gibt Vorteile zum Definieren von Paketen in differenzierter Weise:There are advantages to defining packages in a fine-grained manner:

  • Differenzierte Pakete können gemäß ihrem eigenen Zeitplan mit relativ wenigen Tests von anderen Paketen geliefert werden.Fine-grained packages can ship on their own schedule with relatively limited testing of other packages.
  • Differenzierte Pakete können unterschiedliche Betriebssysteme und CPU-Support bieten.Fine-grained packages can provide differing OS and CPU support.
  • Differenzierte Pakete können über Abhängigkeiten verfügen, die spezifisch zu nur einer Bibliothek sind.Fine-grained packages can have dependencies specific to only one library.
  • Apps sind kleiner, da Pakete, auf die nicht verwiesen wird, kein Teil der App-Verteilung werden.Apps are smaller because unreferenced packages don't become part of the app distribution.

Manche dieser Vorteile werden nur unter bestimmten Umständen verwendet.Some of these benefits are only used in certain circumstances. NET Core-Pakete werden z.B. in der Regel nach demselben Zeitplan mit der gleichen Plattformunterstützung geliefert.For example, NET Core packages will typically ship on the same schedule with the same platform support. Bei der Wartung können Korrekturen als kleine Updates in einem einzigen Paket geliefert und installiert werden.In the case of servicing, fixes can be distributed and installed as small single package updates. Aufgrund des engen Rahmens für Änderungen ist die Überprüfung und Zeit, bis eine Korrektur verfügbar ist, auf die Zeit eingeschränkt, die für eine einzelne Bibliothek benötigt wir.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.

Im Folgenden werden die Haupt-NuGet-Pakete für .NET Core aufgelistet:The following is a list of the key NuGet packages for .NET Core:

In der Regel ist es einfacher, ein Metapaket in Ihr Projekt einzuschließen, als einzelne Pakete. Ein Metapaket ist eine Gruppe von Paketen, die häufig zusammen verwendet werden.Typically, rather than including packages in your projects on a package-by-package basis, it is far easier to include a metapackage, which is a set of packages that are often used together. (Weitere Informationen zu Metapaketen finden Sie im folgenden Abschnitt.) Wenn Sie ein einzelnes Paket benötigen, können Sie es wie im folgenden Beispiel gezeigt einschließen. Das Beispiel verweist auf das System.Runtime-Paket.(For more information on metapackages, see the following section.) However, when you need a single package, you can include it as in the example below, 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>

MetapaketeMetapackages

Metapakete sind eine NuGet-Paket-Konvention zur Beschreibung einer Reihe von Paketen, die zusammen sinnvoll sind.Metapackages are a NuGet package convention for describing a set of packages that are meaningful together. Sie stellen diese Reihe von Paketen dar, indem Sie sie zu Abhängigkeiten machen.They represent this set of packages by making them dependencies. Sie können optional ein Framework für diesen Satz von Paketen einrichten, indem Sie ein Framework angeben.They can optionally establish a framework for this set of packages by specifying a framework.

Frühere Versionen von .NET Core-Tools („project.json“ und csproj-basierte Tools) geben standardmäßig ein Framework und ein Metapaket an.Previous versions of the .NET Core tools (both project.json and csproj-based tools) by default specified both a framework and a metapackage. Derzeit verweist das Zielframework jedoch implizit auf das Metapaket, damit jedes Metapaket mit einem Zielframework verknüpft ist.Currently, however, the metapackage is implicitly referenced by the target framework, so that each metapackage is tied to a target framework. Zum Beispiel verweist das netstandard1.6-Framework auf die NetStandard.Library-Version 1.6.0 des Metapakets.For example, the netstandard1.6 framework references the NetStandard.Library version 1.6.0 metapackage. Das netcoreapp1.1-Framework verweist in ähnlicher Art und Weise auf das Metapaket der Version 1.1.0 der Microsoft.NETCore.App.Similarly, the netcoreapp1.1 framework references the Microsoft.NETCore.App Version 1.1.0 metapackage. Weitere Informationen finden Sie unter Impliziter Metapaketverweis in .NET Core SDK.For more information, see Implicit metapackage package reference in the .NET Core SDK.

Durch das Abzielen auf ein Framework und das implizite Verweisen auf ein Metapaket fügen Sie tatsächlich in einer einzigen Geste einen Verweis auf jedes einzelne abhängige Paket hinzu.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. Alle Bibliotheken in diesen Paketen sind für IntelliSense (oder ähnliches) und für die Veröffentlichung Ihrer Anwendung verfügbar.That makes all of the libraries in those packages available for IntelliSense (or similar experience) and for publishing your app.

Es gibt Vorteile gegenüber der Verwendung von Metapaketen:There are advantages to using metapackages:

  • Ermöglicht benutzerfreundliches Verweisen auf eine große Zahl von differenzierten Paketen.Provides a convenient user experience to reference a large set of fine-grained packages.
  • Definiert eine Reihe von Paketen (einschließlich spezifischer Versionen), die getestet werden, und die gut zusammen funktionieren.Defines a set of packages (including specific versions) that are tested and work well together.

Das .NET-Standard-Metapaket lautet:The .NET Standard metapackage is:

  • NETStandard.Library: Beschreibt die Bibliotheken, die Teil von „.NET Standard“ sind.NETStandard.Library - Describes the libraries that are part of the ".NET Standard". Gilt für alle .NET-Implementierungen (z.B. .NET Framework, .NET Core und Mono), die .NET-Standard unterstützen.Applies to all .NET implementations (for example, .NET Framework, .NET Core and Mono) that support .NET Standard. Legt das Framework „netstandard“ fest.Establishes the 'netstandard' framework.

Das sind die .NET Core-Hauptmetapakete:The key .NET Core metapackages are:

FrameworksFrameworks

.NET Core-Pakete unterstützen jeweils einen Satz an Laufzeit-Frameworks..NET Core packages each support a set of runtime frameworks. Frameworks beschreiben einen zur Verfügung stehenden API-Satz (und mögliche andere Eigenschaften), auf den Sie sich verlassen können, wenn Sie ein bestimmtes Framework als Ziel festlegen.Frameworks describe an available API set (and potentially other characteristics) that you can rely on when you target a given framework. Sie werden mit Versionsangabe versehen, wenn neue APIs hinzugefügt werden.They are versioned as new APIs are added.

System.IO.FileSystem unterstützt z.B. die folgenden Frameworks: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-Plattformen (z.B. xamarinios10)6 Xamarin platforms (for example, xamarinios10)

Es ist hilfreich, die ersten beiden dieser Frameworks zu vergleichen, da diese ein Beispiel für die zwei verschiedenen Arten sind, wie Frameworks definiert werden.It is useful to contrast the first two of these frameworks, since they are examples of the two different ways that frameworks are defined.

Das Framework .NETFramework,Version=4.6 stellt die in .NET Framework 4.6 verfügbaren APIs dar.The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. Sie können Bibliotheken erzeugen, die mit .NET Framework 4.6-Verweisassemblys kompiliert sind, und diese Bibliotheken dann in NuGet-Paketen in einem „net46 lib“-Ordner verteilen.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. Sie werden für Apps verwendet, die .NET Framework 4.6. als Ziel haben oder damit kompatibel sind.It will be used for apps that target the .NET Framework 4.6 or that are compatible with it. Auf diese Weise haben bisher alle Frameworks gearbeitet.This is how all frameworks have traditionally worked.

Das Framework .NETStandard,Version=1.3 ist ein paketbasiertes Framework.The .NETStandard,Version=1.3 framework is a package-based framework. Es verlässt sich auf Pakete, die das Framework als Ziel haben, um APIs zu definieren und in Bezug auf das Framework verfügbar zu machen.It relies on packages that target the framework to define and expose APIs in terms of the framework.

Paketbasierte FrameworksPackage-based Frameworks

Es besteht eine bidirektionale Beziehung zwischen Frameworks und Paketen.There is a two-way relationship between frameworks and packages. Der erste Teil definiert die APIs, die für ein angegebenes Framework verfügbar sind, z.B. netstandard1.3.The first part is defining the APIs available for a given framework, for example netstandard1.3. Pakete, die netstandard1.3 (oder kompatible Frameworks wie netstandard1.0) als Ziel haben, definieren die APIs, die für netstandard1.3 verfügbar sind.Packages that target netstandard1.3 (or compatible frameworks, like netstandard1.0) define the APIs available for netstandard1.3. Das hört sich möglicherweise wie eine zirkuläre Definition an, das ist aber nicht der Fall.That may sound like a circular definition, but it isn't. Aufgrund ihrer Eigenschaft „paketbasiert“ stammt die API-Definition für das Framework aus Paketen.By virtue of being "package-based", the API definition for the framework comes from packages. Das Framework selbst definiert keine APIs.The framework itself doesn't define any APIs.

Der zweite Teil der Beziehung ist die Auswahl von Ressourcen.The second part of the relationship is asset selection. Pakete können Ressourcen für mehrere Frameworks enthalten.Packages can contain assets for multiple frameworks. Bei einem Verweis auf eine Gruppe von Paketen und/oder Metapaketen ist das Framework erforderlich, um zu bestimmen, welche Ressource ausgewählt werden sollen, z.B. net46 oder 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. Es ist wichtig, dass Sie die richtige Ressource auswählen.It is important to select the correct asset. Eine net46-Ressource zum Beispiel ist wahrscheinlich nicht mit .NET Framework 4.0 oder .NET Core 1.0 kompatibel.For example, a net46 asset is not likely to be compatible with .NET Framework 4.0 or .NET Core 1.0.

Paketbasierte Framework-Komposition

Sie können diese Beziehung in der Abbildung oben sehen.You can see this relationship in the image above. Die API hat das Framework als Ziel und definiert es.The API targets and defines the framework. Das Framework wird zur Ressourcenauswahl verwendet.The framework is used for asset selection. Von der Ressource erhalten Sie die API.The asset gives you the API.

Die beiden primären paketbasierten Frameworks, die innerhalb .NET Core verwendet werden, sind:The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET-Standard.NET Standard

Das .NET Standard-Framework (TFM: netstandard) repräsentiert die APIs, die über den .NET-Standard definiert werden und auf diesem basieren.The .NET Standard (target framework moniker: netstandard) framework represents the APIs defined by and built on top of the .NET Standard. Bibliotheken, die auf mehreren Laufzeiten ausgeführt werden sollen, sollten dieses Framework als Ziel haben.Libraries that are intended to run on multiple runtimes should target this framework. Sie werden auf jeder mit .NET Standard kompatiblen Laufzeit, z.B. .NET Core, .NET Framework und Mono/Xamarin unterstützt.They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. Jede dieser Laufzeiten unterstützt eine Reihe von .NET Standardversionen, je nachdem, welche APIs sie implementieren.Each of these runtimes supports a set of .NET Standard versions, depending on which APIs they implement.

Das netstandard-Framework verweist implizit auf die Metapakete NETStandard.Library.The netstandard framework implicitly references the NETStandard.Library metapackage. Die folgende MSBuild-Projektdatei gibt beispielsweise an, dass das Projekt auf netstandard1.6 abzielt, das auf das Metapaket NETStandard.Library Version 1.6 verweist.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>

Allerdings müssen die Verweise des Frameworks und Metapakets in der Projektdatei nicht übereinstimmen, und Sie können das <NetStandardImplicitPackageVersion>-Element in Ihrer Projektdatei verwenden, um eine Frameworkversion anzugeben, die niedriger ist als die Version des Metapakets.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. Zum Beispiel ist die folgende Projektdatei gültig.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>

Es mag merkwürdig erscheinen, netstandard1.3 als Ziel festzulegen, aber die 1.6.0-Version von NETStandard.Library zu verwenden.It may seem strange to target netstandard1.3 but use the 1.6.0 version of NETStandard.Library. Es ist ein gültiger Anwendungsfall, da das Metapaket auch ältere Versionen von netstandard unterstützt.It is a valid use-case, since the metapackage maintains support for older netstandard versions. Möglicherweise ist es der Fall, dass Sie sich auf Version 1.6.0 des Metapakets standardisiert haben und es für alle Ihre Bibliotheken verwenden, die eine Vielzahl von netstandard-Versionen als Ziel haben.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. Bei diesem Ansatz müssen Sie nur NETStandard.Library 1.6.0 wiederherstellen, keine früheren Versionen.With this approach, you only need to restore NETStandard.Library 1.6.0 and not earlier versions.

Das Gegenteil wäre nicht gültig: netstandard1.6 mit der 1.3.0 Version von NETStandard.Library als Ziel festzulegen.The reverse would not be valid: targeting netstandard1.6 with the 1.3.0 version of NETStandard.Library. Sie können kein höheres Framework mit einem niedrigeren Metapaket als Ziel festlegen, da das Metapaket einer niedrigeren Version keine Ressourcen für dieses höhere Framework verfügbar macht.You cannot target a higher framework with a lower metapackage, since the lower version metapackage will not expose any assets for that higher framework. Das Versionsschema für Metapakete bestätigt, dass Metapakete mit der höchsten Version des Frameworks übereinstimmen, das sie beschreiben.The versioning scheme for metapackages asserts that metapackages match the highest version of the framework they describe. Aufgrund des Versionsschemas ist v1.6.0 die erste Version von NETStandard.Library, da sie netstandard1.6-Ressourcen enthält.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 wird im obigen Beispiel für die Symmetrie mit dem obigen Beispiel verwendet, ist aber tatsächlich nicht vorhanden.v1.3.0 is used in the example above, for symmetry with the example above, but does not actually exist.

.NET Core-Anwendung.NET Core Application

Das Framework der .NET Core-Anwendung (TFM: netcoreapp) stellt die Pakete und die zugehörigen APIs dar, die in der .NET Core-Verteilung enthalten sind, sowie das Konsolenanwendungsmodell, das es bereitstellt.The .NET Core Application (TFM: 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-Anwendungen müssen dieses Framework verwenden, da Sie das Konsolenanwendungsmodell als Ziel haben. Bibliotheken, die nur für die Ausführung auf .NET Core vorgesehen waren, sollten dies ebenfalls tun..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. Die Verwendung dieser Frameworks schränkt Apps und Bibliotheken so ein, dass Sie nur noch auf .NET Core ausgeführt werden können.Using this framework restricts apps and libraries to running only on .NET Core.

Das Metapaket Microsoft.NETCore.App hat das Framework netcoreapp als Ziel.The Microsoft.NETCore.App metapackage targets the netcoreapp framework. Es bietet Zugriff auf ~60-Bibliotheken, ~40 werden durch das NETStandard.Library-Paket bereitgestellt, und ~20 weitere werden zusätzlich bereitgestellt.It provides access to ~60 libraries, ~40 provided by the NETStandard.Library package and ~20 more in addition. Sie können auf zusätzliche Bibliotheken verweisen, die netcoreapp oder kompatible Frameworks wie z.B. netstandard als Ziel haben, um den Zugriff auf zusätzliche APIs zu erhalten.You can reference additional libraries that target netcoreapp or compatible frameworks, such as netstandard, to get access to additional APIs.

Die meisten der zusätzlichen Bibliotheken, die von Microsoft.NETCore.App bereitgestellt werden, haben ebenfalls netstandard als Ziel, vorausgesetzt, dass ihre Abhängigkeiten von anderen netstandard-Bibliotheken erfüllt werden.Most of the additional libraries provided by Microsoft.NETCore.App also target netstandard given that their dependencies are satisfied by other netstandard libraries. Dies bedeutet, dass netstandard-Bibliotheken auch auf diese Pakete als Abhängigkeiten verweisen können.That means that netstandard libraries can also reference those packages as dependencies.