Пакеты, метапакеты и платформы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.
  • Мелкомодульные пакеты могут обеспечивать различную поддержку ОС и ЦП.Fine-grained packages can provide differing OS and CPU support.
  • Мелкомодульные пакеты могут иметь зависимости, относящиеся только к одной библиотеке.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.

Ниже приведен список основных пакетов NuGet для .NET Core: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) по умолчанию указывали и платформу, и метапакет.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. Дополнительные сведения см. в разделе Неявная ссылка на пакет метапакетов в пакете SDK для .NET Core.For more information, see Implicit metapackage package reference in the .NET Core SDK.

Ориентируясь на платформу и неявно ссылаясь на метапакет, вы, по сути, одним действием добавляете ссылку на каждый его зависимый пакет.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 (например, .NET Framework, .NET Core и Mono), которые поддерживают .NET Standard.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)

Полезно будет сравнить первые две из этих платформ, так как они представляют два разных способа определения платформ.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 представляет доступные интерфейсы API в .NET Framework 4.6.The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. Вы можете создавать библиотеки, скомпилированные с помощью ссылочных сборок .NET Framework 4.6, а затем распространять их в пакетах NuGet в папке 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. Эта папка будет использоваться для приложений, предназначенных для платформы .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. Платформы определяют интерфейсы API, доступные для конкретной платформы, например netstandard1.3.The first part is defining the APIs available for a given framework, for example netstandard1.3. Пакеты, предназначенные для netstandard1.3 (или совместимых платформ, например netstandard1.0), определяют интерфейсы API, доступные для netstandard1.3.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.

Второй стороной связи является выбор ресурсов.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 используются две основные платформы на основе пакетов:The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET Standard.NET Standard

Платформа .NET Standard (моникер целевой платформы: netstandard) представляет API, которые определяются и создаются на основе .NET Standard.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 Standard, например .NET Core, .NET Framework и Mono или Xamarin.They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. Каждая из этих сред выполнения поддерживает ряд версий .NET Standard в зависимости от реализуемых ими интерфейсов API.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 и одновременное использование версии 1.6.0 библиотеки NETStandard.Library может показаться странным.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. Вследствие такой схемы управления версиями первая версия NETStandard.Library — 1.6.0, при условии, что она содержит ресурсы 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. Версия 1.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) представляет пакеты и связанные интерфейсы 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. Он обеспечивает доступ к примерно 40 библиотекам, предоставляемым пакетом NETStandard.Library, и примерно 20 дополнительным библиотекам (всего около 60 библиотек).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.