Paquetes, metapaquetes y marcos de trabajoPackages, metapackages and frameworks

.NET Core es una plataforma conformada por paquetes NuGet..NET Core is a platform made of NuGet packages. Algunas experiencias del producto se benefician de la definición específica de los paquetes, mientras que otras lo hacen de la definición general de las mismas.Some product experiences benefit from fine-grained definition of packages while others from coarse-grained. Para dar cabida a esta dualidad, el producto se distribuye como un conjunto específico de paquetes y, luego, se describe en fragmentos más generales con un tipo de paquete que recibe informalmente el nombre de "metapaquete".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".

Cada uno de los paquetes de .NET Core admite su ejecución en varias implementaciones .NET, que se representan como marcos de trabajo.Each of the .NET Core packages support being run on multiple .NET implementations, represented as frameworks. Algunos de estos son marcos de trabajo tradicionales, como net46, que representa a .NET Framework.Some of those frameworks are traditional frameworks, like net46, representing the .NET Framework. Otro conjunto son marcos de trabajo nuevos que se pueden considerar "marcos de trabajo basados en paquete", que establecen un modelo nuevo para definir los marcos de trabajo.Another set is new frameworks that can be thought of as "package-based frameworks", which establish a new model for defining frameworks. Estos marcos de trabajo basados en paquete están completamente formadas y definidas como paquetes, lo que establece una fuerte relación entre los paquetes y los marcos de trabajo.These package-based frameworks are entirely formed and defined as packages, forming a strong relationship between packages and frameworks.

PaquetesPackages

.NET Core se divide en un conjunto de paquetes, que proporcionan primitivas, tipos de datos de nivel superior, tipos de composición de aplicaciones y utilidades comunes..NET Core is split into a set of packages, which provide primitives, higher-level data types, app composition types and common utilities. Cada uno de estos paquetes representa un solo ensamblado con el mismo nombre.Each of these packages represent a single assembly of the same name. Por ejemplo, System.Runtime contiene System.Runtime.dll.For example, System.Runtime contains System.Runtime.dll.

Hay ventajas si los paquetes se definen de manera específica:There are advantages to defining packages in a fine-grained manner:

  • Los paquetes específicos se pueden enviar según su propia programación con una prueba relativamente limitada de los otros paquetes.Fine-grained packages can ship on their own schedule with relatively limited testing of other packages.
  • Los paquetes específicos pueden brindar compatibilidad con distintos SO y CPU.Fine-grained packages can provide differing OS and CPU support.
  • Los paquetes específicos pueden tener dependencias específicas solo para una biblioteca.Fine-grained packages can have dependencies specific to only one library.
  • Las aplicaciones son más pequeñas, porque los paquetes a los que no se hace referencia no forman parte de la distribución de aplicaciones.Apps are smaller because unreferenced packages don't become part of the app distribution.

Algunas de estas ventajas solo se usan bajo ciertas circunstancias.Some of these benefits are only used in certain circumstances. Por ejemplo, los paquetes de .NET Core normalmente se envían en la misma programación con la misma compatibilidad de plataforma.For example, NET Core packages will typically ship on the same schedule with the same platform support. En el caso del mantenimiento, las correcciones se pueden distribuir e instalar como pequeñas actualizaciones de paquetes únicos.In the case of servicing, fixes can be distributed and installed as small single package updates. Debido al alcance limitado del cambio, la validación y el tiempo para que una corrección esté disponible están limitados a las necesidades de una biblioteca única.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.

A continuación se muestra una lista de los paquetes NuGet clave para .NET Core:The following is a list of the key NuGet packages for .NET Core:

Normalmente, en lugar de incluir paquetes en sus proyectos en una base de paquete a paquete, es mucho más sencillo incluir un metapaquete, que es un conjunto de paquetes que a menudo se usan conjuntamente.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. (Para obtener más información sobre los metapaquetes, vea la siguiente sección). En cambio, cuando necesite un solo paquete, puede incluirlo como en el ejemplo siguiente, que hace referencia al paquete System.Runtime.(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>

MetapaquetesMetapackages

Los metapaquetes son una conversión de paquetes NuGet que se usa para describir un conjunto de paquetes que tienen sentido juntos.Metapackages are a NuGet package convention for describing a set of packages that are meaningful together. Para representar este conjunto de paquetes, los transforman en dependencias.They represent this set of packages by making them dependencies. De manera opcional, pueden especificar un marco de trabajo a fin de establecer uno para este conjunto de paquetes.They can optionally establish a framework for this set of packages by specifying a framework.

De manera predeterminada, las versiones anteriores de las herramientas de .NET Core (las herramientas basadas en project.json y csproj) especificaban un marco y un metapaquete.Previous versions of the .NET Core tools (both project.json and csproj-based tools) by default specified both a framework and a metapackage. Pero, actualmente, el marco de destino hace referencia implícitamente al metapaquete, de manera que cada uno está asociado a un marco de destino.Currently, however, the metapackage is implicitly referenced by the target framework, so that each metapackage is tied to a target framework. Por ejemplo, el marco netstandard1.6 hace referencia al metapaquete de la versión 1.6.0 de NetStandard.Library.For example, the netstandard1.6 framework references the NetStandard.Library version 1.6.0 metapackage. De manera similar, el marco netcoreapp1.1 hace referencia al metapaquete de la versión 1.1.0 de Microsoft.NETCore.App.Similarly, the netcoreapp1.1 framework references the Microsoft.NETCore.App Version 1.1.0 metapackage. Para obtener más información, vea Implicit metapackage package reference in the .NET Core SDK (Referencia del paquete implícita del metapaquete en el SDK de .NET Core).For more information, see Implicit metapackage package reference in the .NET Core SDK.

Dirigirse a un marco y hacer referencia implícitamente a un metapaquete significa que realmente está agregando una referencia a cada uno de sus paquetes dependientes como un gesto único.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. Esto hace que todas las bibliotecas de esos paquetes estén disponibles para IntelliSense (o una experiencia similar) y para publicar la aplicación.That makes all of the libraries in those packages available for IntelliSense (or similar experience) and for publishing your app.

Usar metapaquetes tiene ventajas:There are advantages to using metapackages:

  • Proporciona una experiencia del usuario adecuada para hacer referencia a un gran conjunto de paquetes específicos.Provides a convenient user experience to reference a large set of fine-grained packages.
  • Define un conjunto de paquetes (incluidas las versiones específicas) que se prueban y trabajan correctamente en conjunto.Defines a set of packages (including specific versions) that are tested and work well together.

El metapaquete del estándar .NET es:The .NET Standard metapackage is:

  • NETStandard.Library: describe las bibliotecas que forman parte del "estándar .NET".NETStandard.Library - Describes the libraries that are part of the ".NET Standard". Se aplica a todas las implementaciones .NET (por ejemplo, .NET Framework, .NET Core y Mono) que admiten el estándar .NET.Applies to all .NET implementations (for example, .NET Framework, .NET Core and Mono) that support .NET Standard. Establece el marco de trabajo "netstandard".Establishes the 'netstandard' framework.

Los metapaquetes principales de .NET Core son:The key .NET Core metapackages are:

Marcos de trabajoFrameworks

Cada paquete de .NET Core admite un conjunto de marcos en tiempo de ejecución..NET Core packages each support a set of runtime frameworks. Los marcos de trabajo describen un conjunto de API disponible (y posiblemente también otras características) en que puede basarse cuando tiene como destino un marco de trabajo determinado.Frameworks describe an available API set (and potentially other characteristics) that you can rely on when you target a given framework. Se crean versiones suyas cada vez que se agregan API nuevas.They are versioned as new APIs are added.

Por ejemplo, System.IO.FileSystem admite los siguientes marcos de trabajo: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 plataformas Xamarin (por ejemplo, xamarinios10)6 Xamarin platforms (for example, xamarinios10)

Es útil contrastar los dos primeros de estos marcos de trabajo, debido a que son ejemplos de las dos formas distintas en que se definen los marcos de trabajo.It is useful to contrast the first two of these frameworks, since they are examples of the two different ways that frameworks are defined.

El marco de trabajo .NETFramework,Version=4.6 representa las API disponibles en .NET Framework 4.6.The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. Puede generar bibliotecas compiladas con los ensamblados de referencia de .NET Framework 4.6 y, luego, distribuir esas bibliotecas en paquetes NuGet en una carpeta 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. Se usará para las aplicaciones que tienen como destino .NET Framework 4.6 o que son compatibles con esa plataforma.It will be used for apps that target the .NET Framework 4.6 or that are compatible with it. Esta es la forma de trabajar tradicional de todos los marcos de trabajo.This is how all frameworks have traditionally worked.

El marco de trabajo .NETStandard,Version=1.3 está basado en paquete.The .NETStandard,Version=1.3 framework is a package-based framework. Se basa en paquetes que tienen como destino el marco de trabajo para definir y exponer las API en términos del marco de trabajo.It relies on packages that target the framework to define and expose APIs in terms of the framework.

Marcos de trabajo basados en paquetePackage-based frameworks

Existe una relación recíproca entre los marcos de trabajo y los paquetes.There is a two-way relationship between frameworks and packages. La primera parte es definir las API disponibles para un marco de trabajo determinado, por ejemplo, netstandard1.3.The first part is defining the APIs available for a given framework, for example netstandard1.3. Los paquetes que tienen como destino netstandard1.3 (o marcos de trabajo compatibles, como netstandard1.0) definen las API disponibles para netstandard1.3.Packages that target netstandard1.3 (or compatible frameworks, like netstandard1.0) define the APIs available for netstandard1.3. Esto puede parecer una definición circular, pero no lo es.That may sound like a circular definition, but it isn't. En virtud de estar "basada en paquete", la definición de API del marco de trabajo proviene de los paquetes.By virtue of being "package-based", the API definition for the framework comes from packages. El marco de trabajo mismo no define a ninguna API.The framework itself doesn't define any APIs.

La segunda parte de la relación es la selección de recursos.The second part of the relationship is asset selection. Los paquetes pueden incluir recursos para varios marcos de trabajo.Packages can contain assets for multiple frameworks. Dada una referencia a un conjunto de paquetes o metapaquetes, el marco de trabajo es necesario para determinar el recurso que se debe seleccionar, por ejemplo net46 o 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 importante seleccionar el recurso correcto.It is important to select the correct asset. Por ejemplo, es poco probable que un recurso de net46 sea compatible con .NET Framework 4.0 o .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.

Puede ver esta relación en la imagen siguiente.You can see this relationship in the following image. La API tiene como destino el marco de trabajo y lo define.The API targets and defines the framework. El marco de trabajo se usa para la selección de recursos.The framework is used for asset selection. El recurso le brinda la API.The asset gives you the API.

Composición del marco de trabajo basado en paquete

Los dos principales marcos de trabajo basados en paquete que se usan con .NET Core son los siguientes:The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET Standard.NET Standard

El marco de .NET Standard (moniker del marco de destino: netstandard) representa las API definidas por .NET Standard y que se basan esta especificación.The .NET Standard (target framework moniker: netstandard) framework represents the APIs defined by and built on top of the .NET Standard. Las bibliotecas diseñadas para ejecutarse en varios entornos de ejecución deben tener como destino este marco de trabajo.Libraries that are intended to run on multiple runtimes should target this framework. Se admitirán en cualquier entorno de ejecución compatible con el estándar .NET, como .NET Core, .NET Framework y Mono/Xamarin.They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. Cada uno de estos entornos de ejecución admite un conjunto de versiones del estándar .NET, en función de las API que implementan.Each of these runtimes supports a set of .NET Standard versions, depending on which APIs they implement.

El marco netstandard hace referencia implícitamente al metapaquete NETStandard.Library.The netstandard framework implicitly references the NETStandard.Library metapackage. Por ejemplo, el siguiente archivo del proyecto de MSBuild indica que el proyecto tiene como destino netstandard1.6, que hace referencia al metapaquete de la versión 1.6 de NETStandard.Library.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>

En cambio, las referencias del metapaquete y el marco en el archivo del proyecto no necesitan coincidir, y puede usar el elemento <NetStandardImplicitPackageVersion> en su archivo del proyecto para especificar una versión de marco que sea anterior a la del metapaquete.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. Por ejemplo, el siguiente archivo del proyecto es válido.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>

Puede parecer extraño establecer netstandard1.3 como destino pero usa la versión 1.6.0 de NETStandard.Library.It may seem strange to target netstandard1.3 but use the 1.6.0 version of NETStandard.Library. Se trata de un caso de uso válido, debido a que el metapaquete mantiene la compatibilidad con versiones anteriores de netstandard.It is a valid use-case, since the metapackage maintains support for older netstandard versions. Podría ser el caso que estandarizó en la versión 1.6.0 del metapaquete y úselo para todas las bibliotecas, que establecen como destino distintas versiones 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. Con este enfoque, solo necesita restaurar NETStandard.Library 1.6.0 y no las versiones anteriores.With this approach, you only need to restore NETStandard.Library 1.6.0 and not earlier versions.

Lo contrario no sería válido: establecer netstandard1.6 como destino con la versión 1.3.0 de NETStandard.Library.The reverse would not be valid: targeting netstandard1.6 with the 1.3.0 version of NETStandard.Library. No puede establecer como destino un marco de trabajo superior con un metapaquete inferior, debido a que el metapaquete de una versión inferior no expondrá ningún recurso para ese marco de trabajo superior.You cannot target a higher framework with a lower metapackage, since the lower version metapackage will not expose any assets for that higher framework. El esquema de control de versiones para los metapaquetes afirma que estos coinciden con la versión más reciente del marco de trabajo que describen.The versioning scheme for metapackages asserts that metapackages match the highest version of the framework they describe. En virtud del esquema de control de versiones, la primera versión de NETStandard.Library es v1.6.0, siempre que contenga recursos de 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 versión v1.3.0 se usa en el ejemplo anterior, para lograr una simetría con el ejemplo anterior, pero no existe realmente.v1.3.0 is used in the example above, for symmetry with the example above, but does not actually exist.

Aplicación .NET Core.NET Core application

El marco de trabajo de la aplicación .NET Core (TFM: netcoreapp) representa los paquetes y las API asociadas que se incluyen en la distribución de .NET Core y el modelo de aplicación de consola que proporciona.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. Las aplicaciones .NET Core deben usar este marco de trabajo, debido a que intentan establecer el modelo de aplicación de consola como destino, al igual que las bibliotecas que se pretende ejecutar solo en .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. Usar este marco de trabajo restringe a las aplicaciones y bibliotecas solo a su ejecución en .NET Core.Using this framework restricts apps and libraries to running only on .NET Core.

El metapaquete Microsoft.NETCore.App tiene como destino el marco de trabajo netcoreapp.The Microsoft.NETCore.App metapackage targets the netcoreapp framework. Proporciona acceso aproximadamente a 60 bibliotecas, de las cuales el paquete NETStandard.Library proporciona unas 40, además de otras 20.It provides access to ~60 libraries, ~40 provided by the NETStandard.Library package and ~20 more in addition. Puede hacer referencia a bibliotecas adicionales que establecen como destino a netcoreapp o marcos de trabajo compatibles, como netstandard, para obtener acceso a API adicionales.You can reference additional libraries that target netcoreapp or compatible frameworks, such as netstandard, to get access to additional APIs.

La mayoría de las bibliotecas adicionales que Microsoft.NETCore.App proporciona también establecen como destino a netstandard, dado que otras bibliotecas netstandard satisfacen sus dependencias.Most of the additional libraries provided by Microsoft.NETCore.App also target netstandard given that their dependencies are satisfied by other netstandard libraries. Esto significa que las bibliotecas netstandard también pueden hacer referencia a esos paquetes como dependencias.That means that netstandard libraries can also reference those packages as dependencies.