Pacchetti, metapacchetti e frameworkPackages, metapackages and frameworks

.NET Core è una piattaforma costituita da pacchetti NuGet..NET Core is a platform made of NuGet packages. Alcuni prodotti traggono vantaggio da una definizione dei pacchetti con granularità fine, mentre altri da una definizione con granularità più grossolana.Some product experiences benefit from fine-grained definition of packages while others from coarse-grained. Per tenere conto di questo dualismo, il prodotto viene distribuito come set di pacchetti con granularità fine e quindi viene descritto in blocchi più grossolani con un tipo di pacchetto denominato in modo informale metapacchetto.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.

Ciascuno dei pacchetti .NET Core supporta l'esecuzione su più implementazioni di .NET, rappresentate come framework.Each of the .NET Core packages support being run on multiple .NET implementations, represented as frameworks. Alcuni di questi framework sono tradizionali, ad esempio net46, e rappresentano l'istanza .NET Framework.Some of those frameworks are traditional frameworks, like net46, representing the .NET Framework. Un altro insieme è costituito da nuovi framework che possono essere considerati come "framework basati su pacchetti", il che stabilisce un nuovo modello di definizione dei framework stessi.Another set is new frameworks that can be thought of as "package-based frameworks", which establish a new model for defining frameworks. Questi framework basati su pacchetti sono interamente formati e definiti come pacchetti, creando una forte relazione tra pacchetti e framework.These package-based frameworks are entirely formed and defined as packages, forming a strong relationship between packages and frameworks.

PacchettiPackages

.NET Core è suddiviso in un set di pacchetti che forniscono primitive, tipi di dati di livello superiore, tipi di composizione delle app e utilità di uso comune..NET Core is split into a set of packages, which provide primitives, higher-level data types, app composition types and common utilities. Ognuno di questi pacchetti rappresenta un singolo assembly con lo stesso nome.Each of these packages represent a single assembly of the same name. Ad esempio, System.Runtime contiene System.Runtime.dll.For example, System.Runtime contains System.Runtime.dll.

La definizione dei pacchetti con granularità fine presenta alcuni vantaggi:There are advantages to defining packages in a fine-grained manner:

  • I pacchetti con granularità fine possono essere distribuiti in base a una specifica pianificazione, con operazioni di test di altri pacchetti relativamente limitate.Fine-grained packages can ship on their own schedule with relatively limited testing of other packages.
  • I pacchetti con granularità fine possono fornire supporto per diversi sistemi operativi e CPU.Fine-grained packages can provide differing OS and CPU support.
  • I pacchetti con granularità fine possono avere dipendenze specifiche da una sola libreria.Fine-grained packages can have dependencies specific to only one library.
  • Le app hanno dimensioni ridotte perché i pacchetti senza riferimenti non diventano parte della distribuzione delle app stesse.Apps are smaller because unreferenced packages don't become part of the app distribution.

Alcuni di questi vantaggi vengono sfruttati solo in particolari circostanze.Some of these benefits are only used in certain circumstances. I pacchetti .NET Core, ad esempio, possono essere distribuiti in base alla stessa pianificazione con lo stesso supporto di piattaforma.For example, NET Core packages will typically ship on the same schedule with the same platform support. Nel caso di interventi di manutenzione, le correzioni possono essere distribuite e installate come piccoli aggiornamenti di singoli pacchetti.In the case of servicing, fixes can be distributed and installed as small single package updates. A causa del ristretto ambito di modifica, le operazioni di convalida e il tempo necessario per rendere una correzione disponibile sono limitati a quanto necessario per una singola libreria.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.

Di seguito è riportato un elenco dei principali pacchetti NuGet per .NET Core:The following is a list of the key NuGet packages for .NET Core:

In genere, anziché includere ogni pacchetto, è più semplice e affidabile includere un metapacchetto.Typically, rather than including each package, it's easier and more robust to include a metapackage. Tuttavia, se è necessario usare un singolo pacchetto, è possibile includerlo come mostrato nell'esempio seguente, che fa riferimento al pacchetto 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>

MetapacchettiMetapackages

I metapacchetti sono una convenzione di NuGet per descrivere un set di pacchetti che sono significativi insieme.Metapackages are a NuGet package convention for describing a set of packages that are meaningful together. I metapacchetti rappresentano questo set di pacchetti trasformandoli in dipendenze.They represent this set of packages by making them dependencies. Facoltativamente, stabiliscono un framework per questo set di pacchetti specificando appunto un framework.They can optionally establish a framework for this set of packages by specifying a framework.

Le versioni precedenti degli strumenti di .NET Core (gli strumenti project.json e gli strumenti basati su csproj) specificavano un framework e un metapacchetto.Previous versions of the .NET Core tools (both project.json and csproj-based tools) by default specified both a framework and a metapackage. Il framework di destinazione fa attualmente riferimento in modo implicito al metapacchetto, in modo che ogni metapacchetto sia associato a un framework di destinazione.Currently, however, the metapackage is implicitly referenced by the target framework, so that each metapackage is tied to a target framework. Ad esempio, il framework netstandard1.6 fa riferimento a NetStandard.Library versione 1.6.0.For example, the netstandard1.6 framework references the NetStandard.Library version 1.6.0 metapackage. Analogamente, il framework netcoreapp2.1 fa riferimento al metapacchetto Microsoft.NETCore.App versione 2.1.0.Similarly, the netcoreapp2.1 framework references the Microsoft.NETCore.App Version 2.1.0 metapackage. Per altre informazioni, vedere Implicit metapackage package reference in the .NET Core SDK (Riferimento implicito a un pacchetto di un metapacchetto in .NET Core SDK).For more information, see Implicit metapackage package reference in the .NET Core SDK.

La destinazione a un framework e il riferimento implicito a un metapacchetto implica che in realtà viene aggiunto un riferimento a ogni pacchetto dipendente con una singola operazione.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. Ciò rende disponibili tutte le librerie incluse nei pacchetti per IntelliSense (o metodi simili) e per la pubblicazione dell'app.That makes all of the libraries in those packages available for IntelliSense (or similar experience) and for publishing your app.

L'uso dei metapacchetti presenta i vantaggi seguenti:There are advantages to using metapackages:

  • Fornisce un'esperienza utente che consente di fare facilmente riferimento a un elevato numero di pacchetti con granularità fine.Provides a convenient user experience to reference a large set of fine-grained packages.
  • Definisce un set di pacchetti (incluse versioni specifiche) che vengono testati e funzionano bene insieme.Defines a set of packages (including specific versions) that are tested and work well together.

Il metapacchetto di .NET Standard è:The .NET Standard metapackage is:

  • NETStandard.Library: descrive le librerie che fanno parte di ".NET Standard".NETStandard.Library - Describes the libraries that are part of the ".NET Standard". Si applica a tutte le implementazioni .NET che supportano .NET Standard, ad esempio .NET Framework, .NET Core e Mono.Applies to all .NET implementations (for example, .NET Framework, .NET Core and Mono) that support .NET Standard. Stabilisce il framework 'netstandard'.Establishes the 'netstandard' framework.

I metapacchetti principali di .NET Core sono:The key .NET Core metapackages are:

FrameworkFrameworks

Ogni pacchetto di .NET Core supporta un set di framework di runtime..NET Core packages each support a set of runtime frameworks. I framework descrivono un set di API disponibili (e potenzialmente altre caratteristiche) che è possibile usare quando si definisce un determinato framework come destinazione.Frameworks describe an available API set (and potentially other characteristics) that you can rely on when you target a given framework. Vengono sottoposti al controllo delle versioni quando si aggiungono nuove API.They are versioned as new APIs are added.

Ad esempio, System.IO.FileSystem supporta i framework seguenti:For example, System.IO.FileSystem supports the following frameworks:

  • .NETFramework, versione 4.6.NETFramework,Version=4.6
  • .NETStandard,versione 1.3.NETStandard,Version=1.3
  • 6 piattaforme Xamarin, ad esempio xamarinios106 Xamarin platforms (for example, xamarinios10)

È utile confrontare i primi due di questi framework, in quanto sono esempi dei due diversi modi di definire i framework.It is useful to contrast the first two of these frameworks, since they are examples of the two different ways that frameworks are defined.

Il framework .NETFramework,Version=4.6 rappresenta le API disponibili in .NET Framework 4.6.The .NETFramework,Version=4.6 framework represents the available APIs in the .NET Framework 4.6. È possibile creare librerie compilate con assembly di riferimento .NET Framework 4.6 e quindi distribuirle in pacchetti NuGet in una cartella '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. Questo procedimento verrà usato per app che hanno come destinazione .NET Framework 4.6 o che sono compatibili con esso.It will be used for apps that target the .NET Framework 4.6 or that are compatible with it. Quella sopra descritta è la tradizionale modalità di funzionamento dei framework.This is how all frameworks have traditionally worked.

.NETStandard,Version=1.3 è un framework basato su pacchetti.The .NETStandard,Version=1.3 framework is a package-based framework. Si basa su pacchetti che hanno come destinazione il framework per definire ed esporre le API in termini di framework.It relies on packages that target the framework to define and expose APIs in terms of the framework.

Framework basati su pacchettiPackage-based frameworks

Tra i framework e i pacchetti è presente una relazione bidirezionale.There is a two-way relationship between frameworks and packages. La prima parte consiste nella definizione delle API disponibili per un determinato framework, ad esempio netstandard1.3.The first part is defining the APIs available for a given framework, for example netstandard1.3. I pacchetti che hanno come destinazione netstandard1.3 (o framework compatibili quali netstandard1.0) definiscono le API disponibili per netstandard1.3.Packages that target netstandard1.3 (or compatible frameworks, like netstandard1.0) define the APIs available for netstandard1.3. Può sembrare una definizione circolare, ma non lo è.That may sound like a circular definition, but it isn't. Poiché è basato su pacchetti, la definizione delle API per il framework deriva dai pacchetti.By virtue of being "package-based", the API definition for the framework comes from packages. Il framework stesso non definisce alcuna API.The framework itself doesn't define any APIs.

La seconda parte della relazione è la selezione delle risorse.The second part of the relationship is asset selection. I pacchetti possono contenere risorse per più framework.Packages can contain assets for multiple frameworks. Dato un riferimento a un set di pacchetti e/o metapacchetti, il framework è necessario per determinare quale risorsa deve essere selezionata, ad esempio 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. È importante selezionare la risorsa corretta.It is important to select the correct asset. Ad esempio, è improbabile che una risorsa net46 sia compatibile 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.

La relazione è illustrata nella figura seguente.You can see this relationship in the following image. L'API identifica il framework come destinazione e lo definisce.The API targets and defines the framework. Il framework viene usato per la selezione delle risorse.The framework is used for asset selection. La risorsa fornisce l'API.The asset gives you the API.

Composizione dei framework basati su pacchetti

I due principali framework basati su pacchetti usati con .NET Core sono i seguenti:The two primary package-based frameworks used with .NET Core are:

  • netstandard
  • netcoreapp

.NET Standard.NET Standard

Il framework .NET Standard (moniker framework di destinazione: netstandard) rappresenta le API definite e create sulla base di .NET Standard.The .NET Standard (Target Framework Moniker: netstandard) framework represents the APIs defined by and built on top of the .NET Standard. Le librerie da eseguire su più runtime devono avere come destinazione questo framework.Libraries that are intended to run on multiple runtimes should target this framework. Tali librerie verranno supportate su qualsiasi runtime compatibile con .NET Standard, ad esempio .NET Core, .NET Framework e Mono/Xamarin.They will be supported on any .NET Standard compliant runtime, such as .NET Core, .NET Framework and Mono/Xamarin. Ciascuno di questi runtime supporta un set di versioni di .NET Standard, a seconda delle API implementate.Each of these runtimes supports a set of .NET Standard versions, depending on which APIs they implement.

Il framework netstandard fa riferimento in modo implicito al metapacchetto NETStandard.Library.The netstandard framework implicitly references the NETStandard.Library metapackage. Ad esempio, il file di progetto MSBuild seguente indica che il progetto è destinato a netstandard1.6, che fa riferimento al metapacchetto di NETStandard.Library versione 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>

Tuttavia, i riferimenti al framework e al metapacchetto nel file di progetto non devono essere uguali. È possibile usare l'elemento <NetStandardImplicitPackageVersion> del file di progetto per specificare una versione di framework antecedente alla versione del metapacchetto.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. Ad esempio, il file di progetto seguente è valido.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>

Può sembrare strano definire come destinazione netstandard1.3 ma usare la versione 1.6.0 della NETStandard.Library.It may seem strange to target netstandard1.3 but use the 1.6.0 version of NETStandard.Library. Si tratta di un caso di uso valido, dal momento che il metapacchetto mantiene il supporto per le precedenti versioni di netstandard.It is a valid use-case, since the metapackage maintains support for older netstandard versions. Può trattarsi di una situazione in cui è stata definita come standard la versione 1.6.0 del pacchetto e tale versione è stata usata per tutte le librerie, che hanno come destinazione un'ampia gamma di versioni di 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 questo approccio, è sufficiente ripristinare NETStandard.Library 1.6.0 e non le versioni precedenti.With this approach, you only need to restore NETStandard.Library 1.6.0 and not earlier versions.

La situazione opposta, ovvero la definizione di netstandard1.6 come destinazione con la versione 1.3.0 della NETStandard.Library, non è valida.The reverse would not be valid: targeting netstandard1.6 with the 1.3.0 version of NETStandard.Library. Non è possibile definire come destinazione la versione più recente di un framework con una versione precedente di un metapacchetto. La versione precedente del metapacchetto, infatti, non espone alcuna risorsa per la versione più recente del framework.You cannot target a higher framework with a lower metapackage, since the lower version metapackage will not expose any assets for that higher framework. Lo schema di controllo delle versioni per i metapacchetti impone che questi ultimi siano di una versione più recente del framework che descrivono.The versioning scheme for metapackages asserts that metapackages match the highest version of the framework they describe. In base a questo schema di versionamento, la prima versione della NETStandard.Library è la 1.6.0, dato che contiene le risorse 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 versione 1.3.0 viene usata nell'esempio precedente per simmetria, ma di fatto non esiste.v1.3.0 is used in the example above, for symmetry with the example above, but does not actually exist.

Applicazione .NET Core.NET Core application

Il framework .NET Core ( moniker framework di destinazione: netcoreapp) rappresenta i pacchetti e le API associate inclusi nella distribuzione .NET Core e con il modello di applicazione console fornito.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. Le app .NET Core devono usare questo framework poiché hanno come destinazione il modello dell'applicazione console. Devono usare questo framework anche le librerie da eseguire solo in .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'uso di questo framework impone che le app e le librerie vengano eseguite solo in .NET Core.Using this framework restricts apps and libraries to running only on .NET Core.

Il metapacchetto Microsoft.NETCore.App ha come destinazione il framework netcoreapp.The Microsoft.NETCore.App metapackage targets the netcoreapp framework. Consente l'accesso a circa 60 librerie, circa 40 fornite dal pacchetto NETStandard.Library e le rimanenti 20 in aggiunta.It provides access to ~60 libraries, ~40 provided by the NETStandard.Library package and ~20 more in addition. È possibile fare riferimento a librerie aggiuntive che hanno come destinazione netcoreapp o framework compatibili, ad esempio netstandard, per ottenere l'accesso ad altre API.You can reference additional libraries that target netcoreapp or compatible frameworks, such as netstandard, to get access to additional APIs.

Anche la maggior parte delle librerie fornite da Microsoft.NETCore.App ha come destinazione netstandard, dato che le relative dipendenze sono soddisfatte da altre librerie netstandard.Most of the additional libraries provided by Microsoft.NETCore.App also target netstandard given that their dependencies are satisfied by other netstandard libraries. Questo significa che anche le librerie netstandard possono fare riferimento a tali pacchetti come dipendenze.That means that netstandard libraries can also reference those packages as dependencies.