В цій статті
NET Core - це платформа, що складається з пакетів NuGet. Для деяких можливостей продукту краще підходить дрібномодульних визначення пакетів, а для інших - крупномодульних. З урахуванням такої подвійності продукт розповсюджується у вигляді дрібномодульних набору пакетів, а потім описується в вигляді більших блоків за допомогою типу пакетів, неофіційно званого "метапакетамі".
Кожен пакет .NET Core підтримує виконання в різних реалізаціях .NET, представлених платформами. Деякі з них - це традиційні платформи, наприклад пакет net46 представляє платформу .NET Framework. Інший набір - це нові платформи, які можна уявити як "платформи на основі пакетів". Вони утворюють нову модель визначення платформ. Платформи на основі пакетів повністю формуються і визначаються як пакети, завдяки чому створюється тісний зв'язок між пакетами і платформами.
Платформа .NET Core розділяється на набір пакетів, які надають типи-примітиви, типи даних більш високого рівня, складові типи додатків і загальні службові програми. Кожен з цих пакетів представляє окрему збірку з тим же ім'ям. Наприклад, System.Runtime містить збірку System.Runtime.dll.
Дрібномодульних визначення пакетів має ряд переваг:
- Дрібномодульні пакети можуть випускатися за власним графіком; необхідність в тестуванні інших пакетів порівняно невелика.
- Дрібномодульні пакети можуть забезпечувати різну підтримку ОС і ЦП.
- Дрібномодульні пакети можуть мати залежності, що стосуються лише однієї бібліотеці.
- Додатки мають менший розмір, так як пакети, на які немає посилань, не включаються до розповсюджуваний пакет програми.
Деякі з цих переваг реалізуються тільки в певних умовах. Наприклад, пакети NET Core зазвичай випускаються за єдиним графіком з однаковою підтримкою платформ. З метою обслуговування виправлення можуть поширюватися і встановлюватися як оновлення для окремих пакетів. Завдяки тому що виправлення застосовується до окремої бібліотеці, скорочується час його перевірки та надання.
Нижче наведено список основних пакетів NuGet для .NET Core:
Метапакети
Метапакети - це прийняте в NuGet угоду для опису набору пакетів, будь-яким чином пов'язаних один з одним. Для подання набору пакетів як метапакета пакети робляться залежними. Метапакет також може визначати платформу для набору пакетів шляхом вказівки відповідної платформи.
Використання метапакетов дає наступні переваги:
- дозволяє користувачам легко посилатися на великий набір дрібномодульних пакетів;
- дозволяє визначати набори пакетів (включаючи конкретні версії), які тестуються і застосовуються як єдине ціле.
Метапакет .NET Standard:
- NETStandard.Library - описує бібліотеки, що входять в .NET Standard. Застосовується до всіх реалізацій .NET (наприклад. NET Framework. NET Core і Mono), які підтримують .NET Standard. Формує платформу netstandard.
Основні метапакети .NET Core:
- Microsoft.NETCore.App - описує бібліотеки, що входять в розповсюджуваний пакет .NET Core. Формує платформу .NETCoreApp. Залежить від метапакета NETStandard.Library.
- Microsoft.NETCore.Portable.Compatibility - набір інтерфейсів сумісності, які забезпечують виконання переносяться бібліотек класів на основі mscorlib в .NET Core.
інфраструктури
Пакети .NET Core підтримують набір платформ середовища виконання. Платформа описує доступний набір API (і, можливо, інших характеристик), який можна застосовувати при створенні рішення для даної платформи. Платформі присвоюється нова версія при додаванні нових інтерфейсів API.
Наприклад, System.IO.FileSystem підтримує наступні платформи:
- .NETFramework, Version = 4.6;
- .NETStandard, Version = 1.3;
- 6 платформ Xamarin (наприклад, xamarinios10).
Корисно буде порівняти перші дві з цих платформ, так як вони представляють два різні способи визначення платформ.
Платформа .NETFramework, Version = 4.6 представляє доступні інтерфейси API в .NET Framework 4.6. Ви можете створювати бібліотеки, скомпільовані за допомогою посилальних збірок .NET Framework 4.6, а потім поширювати їх в пакетах NuGet в папці lib net46. Ця папка буде використовуватися для додатків, призначених для платформи .NET Framework 4.6 або сумісних з нею. Саме так традиційно працювали платформи.
Платформа .NETStandard, Version = 1.3 - це платформа на основі пакетів. Вона використовує пакети, призначені для платформи, з метою визначення та надання інтерфейсів API в контексті платформи.
Платформи на основі пакетів
Між платформами і пакетами існує двосторонній зв'язок. Платформи визначають інтерфейси API, доступні для конкретної платформи, наприклад netstandard1.3. Пакети, призначені для netstandard1.3 (або сумісних платформ, наприклад netstandard1.0), визначають інтерфейси API, доступні для netstandard1.3. Таке визначення може здаватися циклічно замкнутим, але це не так. Інтерфейси API для платформи засновані на пакетах, тобто визначаються в них. Сама платформа не визначає інтерфейси API.
Другою стороною зв'язку є вибір ресурсів. Пакети можуть містити ресурси для декількох платформ. При наявності посилання на набір пакетів або метапакетов платформі необхідно визначити, який ресурс слід вибрати, наприклад net46 або netstandard1.3. Важливо вибрати правильний ресурс. Наприклад, ресурс net46 навряд чи буде сумісний з .NET Framework 4.0 або .NET Core 1.0.
Цей зв'язок можна простежити на наведеному нижче малюнку. Інтерфейс API націлений на платформу і визначає її. Платформа служить для вибору активу. Актив надає інтерфейс API.
В .NET Core використовуються дві основні платформи на основі пакетів:
.NET Standard
Платформа .NET Standard (монікер цільової платформи: netstandard) представляє API, які визначаються і створюються на основі .NET Standard. Бібліотеки, призначені для різних середовищ виконання, повинні бути націлені на цю платформу. Вони будуть підтримуватися в будь-якому середовищі виконання, сумісної з .NET Standard, наприклад .NET Core. NET Framework і Mono або Xamarin. Кожна з цих середовищ виконання підтримує ряд версій .NET Standard в залежності від реалізованих ними інтерфейсів API.
Платформа netstandard неявно посилається на метапакет NETStandard.Library. Наприклад, наступний файл проекту MSBuild вказує, що проект призначений для бібліотеки netstandard1.6. яка посилається на метапакет NETStandard.Library версії 1.6.
Але платформа і посилання на метапакет в файлі проекту не обов'язково повинні збігатися, і ви можете використовувати елемент
Націлювання на netstandard1.3 і одночасне використання версії 1.6.0 бібліотеки NETStandard.Library може здатися дивним. Однак це допустимий сценарій використання, так як метапакет підтримує старіші версії netstandard. Наприклад, ви могли вибрати версію 1.6.0 метапакета для стандартизації всіх бібліотек, які призначені для різних версій netstandard. При такому підході необхідно відновлювати тільки NETStandard.Library 1.6.0, але не попередні версії.
Зворотне (наприклад, націлювання на netstandard1.6 за допомогою NETStandard.Library версії 1.3.0) неприпустимо. Націлювання на платформу певної версії за допомогою метапакета більш ранньої версії неможливо, так як такий метапакет не надаватиме ресурси для платформи новішої версії. Згідно зі схемою управління версіями метапакетов метапакети відповідають найпізнішої версії платформи, яку вони описують. Внаслідок такої схеми управління версіями перша версія NETStandard.Library - 1.6.0, за умови, що вона містить ресурси netstandard1.6. Версія 1.3.0 використовується в попередньому прикладі для узгодженості з іншим наведеним вище прикладом, хоча такої версії насправді немає.
Додаток .NET Core
Платформа додатків .NET Core (TFM: netcoreapp) представляє пакети і пов'язані інтерфейси API, які входять до складу розповсюджуваного пакета .NET Core і надається їм моделі консольних додатків. Додатки .NET Core повинні використовувати цю платформу внаслідок націлювання на модель консольних додатків, так само як і бібліотеки, призначені для виконання тільки в .NET Core. При використанні цієї платформи програми та бібліотеки можуть виконуватися тільки в .NET Core.
Метапакет Microsoft.NETCore.App призначений для платформи netcoreapp. Він забезпечує доступ до приблизно 40 бібліотекам, що надаються пакетом NETStandard.Library. і приблизно 20 додаткових бібліотекам (всього близько 60 бібліотек). Ви можете посилатися на додаткові бібліотеки, призначені для netcoreapp або сумісних платформ, наприклад netstandard. для отримання доступу до додаткових інтерфейсів API.
Більшість додаткових бібліотек, що надаються Microsoft.NETCore.App. також призначені для netstandard. за умови що їх залежності забезпечуються іншими бібліотеками netstandard. Це означає, що бібліотеки netstandard також можуть посилатися на ці пакети в якості залежностей.