nuget пакет что это
Введение в NuGet
Ключевой инструмент для любой современной платформы разработки — это механизм, с помощью которого разработчики могут создавать, передавать друг другу и использовать полезный код. Часто такой код распределен по «пакетам», включающим скомпилированный код (в виде библиотек DLL) и другое содержимое, необходимое использующим эти пакеты проектам.
Так как NuGet поддерживает закрытые узлы наряду с открытым узлом nuget.org, с помощью пакетов NuGet вы можете делиться кодом, используемым в рамках организации или рабочей группы. Пакеты NuGet также являются удобным способом факторизовать свой код для использования только в собственных проектах. Иными словами, пакет NuGet является совместно используемой единицей кода, однако не требует и не подразумевает какого-либо определенного способа предоставления общего доступа.
Поток пакетов между создателями, узлами и потребителями
Независимо от своей природы, узел выступает в качестве точки подключения между создателями и потребителями пакета. Создатели разрабатывают полезные пакеты NuGet и публикуют их на узле. Потребители ищут полезные и совместимые пакеты на доступных узлах, скачивая эти пакеты и включая их в свои проекты. После установки в проекте API пакеты становятся доступны остальной части кода проекта.
Совместимость пакета с разными целевыми платформами
Средства NuGet
Кроме поддержки размещения, NuGet также предоставляет широкий набор средств, используемых как создателями, так и потребителями. Сведения о получении конкретных средств см. в разделе Установка клиентских средств NuGet.
Как видите, средства NuGet, с которыми вы работаете, в значительной степени зависят от того, создаете, потребляете или публикуете вы пакеты, а также от используемой платформы. Создатели пакета обычно также являются потребителями, так как берут за основу функции, имеющиеся в других пакетах NuGet. Конечно же, те пакеты, в свою очередь, могут зависеть еще от каких-либо.
Управление зависимостями
Возможность легко брать за основу работу других — это одна из наиболее мощных функций системы управления пакетами. Соответственно, значительная часть работы NuGet заключается в управлении этим деревом или «схемой» зависимостей от имени проекта. Проще говоря, вам нужно заботиться только о тех пакетах, которые вы используете непосредственно в проекте. Если эти пакеты используют другие пакеты (которые, в свою очередь, также используют пакеты), все эти зависимости нижнего уровня обрабатывает NuGet.
На следующем рисунке показан проект, зависящий от пяти пакетов, которые, в свою очередь, зависят от нескольких других.
Обратите внимание, что некоторые пакеты встречаются на графе зависимостей несколько раз. Например, существует три разных потребителя пакета B, и каждый из них может также указывать другую версию этого пакета (не показано). Это обычное дело, особенно для широко используемых пакетов. NuGet выполняет всю работу, чтобы определить, какая именно версия пакета B отвечает потребностям всех потребителей. Затем NuGet делает то же самое для всех других пакетов, независимо от того, насколько глубока схема зависимостей.
Дополнительные сведения о том, как NuGet выполняет эту задачу, см. в разделе Разрешение зависимостей.
Отслеживание ссылок и восстановление пакетов
Так как проекты можно легко перемещать между компьютерами разработчиков, репозиториями управления исходным кодом, серверами сборки и т. д., крайне непрактично хранить двоичные сборки из пакетов NuGet напрямую привязанными к проекту. В этом случае каждая копия проекта будет излишне раздутой (и, следовательно, расходовать пространство в репозиториях системы управления исходным кодом). Кроме того, обновить двоичные файлы пакета до новой версии будет очень сложно, так как обновление будет применяться ко всем копиям проекта.
Вместо этого NuGet поддерживает простой список ссылок на пакеты, от которых зависит проект, включая зависимости верхнего и нижнего уровня. То есть при установке пакета с некоторого узла в проект NuGet записывает идентификатор пакета и номер версии в этот список ссылок. (При удалении пакет, конечно же, убирается из этого списка.) Затем в NuGet можно восстановить все связанные пакеты по запросу, как описано в статье о восстановлении пакета.
используя только список ссылок, NuGet можете переустановить, то есть восстановить— все эти пакеты из общедоступных и (или) частных узлов в любое другое время. При фиксации проекта в системе управления исходным кодом или предоставления его для общего доступа каким-либо иным образом нужно включить только список ссылок и исключить какие-либо двоичные файлы пакета (см. раздел Пропуск пакетов NuGet в системах управления исходным кодом.)
Компьютер, принимающий проект, например сервер сборки, получающий копию проекта в рамках работы системы автоматического развертывания, просто запрашивает у NuGet восстановление зависимости всякий раз, когда они понадобятся. Системы сборки, такие как Azure DevOps, предоставляют шаги «Восстановление NuGet» именно для этой цели. Аналогично, когда разработчики получают копию проекта (например, при клонировании репозитория), они могут вызвать такие команды, как nuget restore (CLI NuGet), dotnet restore (CLI dotnet) или Install-Package (консоль диспетчера пакетов), чтобы получить все необходимые пакеты. Visual Studio, со своей стороны, автоматически восстанавливает пакеты при создании проекта (при условии, что включено автоматическое восстановление, как описано в статье Восстановление пакетов).
Очевидно, что основная роль NuGet, связанная с разработчиками, заключается в обслуживании этого списка ссылок от имени проекта и предоставлении средств для эффективного восстановления (и обновления) таких указанных в ссылках пакетов. Этот список хранится в одном из двух указанных ниже форматов управления пакетами:
Применение конкретного формата управления пакетами зависит от типа проекта и доступной версии Visual Studio и NuGet. Чтобы проверить, какой формат используется, просто найдите packages.config в корневом каталоге проекта после установки первого пакета. Если этот файл отсутствует, найдите в файле проекта элемент
При наличии возможности выбора рекомендуем использовать PackageReference. Файл packages.config используется в устаревших версиях и больше не применяется в активной разработке.
Что еще делает NuGet?
Мы уже выучили следующие характеристики NuGet:
Чтобы обеспечить эффективную работу этих процессов, NuGet осуществляет некоторые оптимизации в фоновом режиме. В частности, NuGet управляет кэшем пакета и папкой глобальных пакетов, что позволяет упростить установку и повторною установку. Кэш позволяет избежать загрузки пакета, который уже установлен на компьютере. Папка глобальных пакетов позволяет в нескольких проектах совместно использовать один установленный пакет, тем самым уменьшая общий размер пакетов NuGet на компьютере. Это очень удобно, когда вы часто восстанавливаете большее количество пакетов, например, как на сервере сборки. Дополнительные сведения об этих механизмах см. в статье Управление папкой установки глобальных пакетов, кэшем и временными папками.
В рамках отдельного проекта NuGet управляет общей схемой зависимостей, что включает в себя разрешение нескольких ссылок на различные версии одного пакета. Довольно часто проект зависит от одного или нескольких пакетов, имеющих такие же зависимости. Некоторые из наиболее полезных пакетов служебных программ на сайте nuget.org используются многими другими пакетами. В общей схеме зависимостей вы легко можете иметь десять различных ссылок на разные версии одного пакета. Чтобы избежать переноса нескольких версий этого пакета в само приложение, NuGet определяет, какую отдельную версию могут использовать все потребители. (Дополнительные сведения см. в разделе Принципы разрешения зависимостей пакетов в NuGet.)
кроме того, NuGet поддерживает все спецификации, связанные с структурированием пакетов (включая символы локализации и отладки) и способы их ссылки (включая диапазоны версий и предварительные версии). NuGet также имеет различные API для работы со своими службами программно и предоставляет поддержку разработчикам, которые пишут расширения Visual Studio и шаблоны проектов.
Если изучить содержание этой документации, можно найти все указанные возможности и заметки о выпуске, отсылающие к самому начальному этапу развития NuGet.
Связанные видео
Другие видео о NuGet см. на Channel 9 и YouTube.
Комментарии, вклады и проблемы
Наконец, мы очень много запустили комментарии и вклады в эту документацию: просто выберите команды отзыва и редактирования в верхней части любой страницы или посетите страницу « репозиторий документов » и список проблем с документацией по GitHub.
Надеемся, что вам понравится работать с NuGet.
Что такое NuGet?
Просто о NET | создано: 13.06.2011 | опубликовано: 13.06.2011 | обновлено: 19.12.2021 | просмотров: 42429 | комментариев: 2
В статье показано как установить NuGet и что это такое. Показаны примеры управления пакетами NuGet. Достаточно подробно и с картинками.
Если не установлен NuGet
Что такое NuGet не буду подробно рассказывать, разве что пару строк:
Со страниц официального сайта
“NuGet is a Visual Studio extension that makes it easy to install and update open source libraries and tools in Visual Studio.”
А теперь на русском
“Nuget – это одно из расширение Visual Studio, которое позволяет с легкостью устанавливать, обновлять и удалять библиотеки (сборки), компоненты, инструменты.”
Если у Вас не установлен это замечательное расширения для Visual Studio, давайте установим. Запускаем студию, идем в меню: Tools –> Extention Manager. Откроется окно менеджера, в этом окне в левой части выберим Online Gallery, менеджер покажет список доспуных расширений. По идеи, Вы должны сразу увидеть Nuget Package Manager. Но если Вы не увидели его, напишите в строке поиска этого менеджера слово “nuget” и тогда точно перед Вами будет менеджер.
У меня на картинке NuGet Manager отмечен зеленой галкой, которая говорит, что расширение уже установлено. Если Вы нажмете кнопку Install, у Вас появится такой же зеленый значок.
Как установить пакет (способ 1 “Визуальный”)
Я создал просто консольное приложение (просто для демонстрации). В Solution Explorer правой кнопкой мыши нажимаем на Preferences и в меню выбираем пункт Add Library Package references. Этот пункт меню должен появиться после установки менеджера пакетов NuGet.
В открывшемся окне, также как и в менеджере расширений для Visual Studio, есть список доступных галерей (слева). Хочу напомнить, что можно получать пакеты как с официального сайта (NuGet official package source), так и папки на своем компьютере, так и с NuGet-сервера локальной сети.
Я в поиске написал свой ник и увидел список доступных пакетов, которые я сделал сам:
Допустим, что я хочу в своё консольное приложение добавить несколько классов и наполнить их данными, чтобы поэкспериментировать с LINQ. Я выберу пакет SampleData и нажму Install. После установки пакет отметился зеленой галкой, а в списке сборок проекта появилась сборка SampleData, которая содержит классы и данные для них:
Если запустить приложение, то я увижу
Как установить NuGet-пакет (способ 2 “Для продвинутых”)
Давайте теперь создадим другое приложение, пусть оно тоже будет консольное. Теперь будем устанавливать Implementation a simple IoC, этот пакет я сделал тоже сам и для себя (но можете тоже пользовать на здоровье). После установки Nuget Package Manager в меню Visual Studio появились новые пункты, например, Tools –> Library Package Manager –> Package Manager Console.
Открыв консоль можно писать команды для менеджера:
Обратите внимание, что выпадающее окно Package source позволяет выбрать конкретный источник пакетов или использовать все доступные.
Напишу-ка я команду для установки моего пакета с IoC:
Команда NuGetInstall-Package SimpleIoC
Пакет установлен. У меня в приложении появился файл SimpleIoC.cs, который является реализацией паттерна IoC (Инверсия в управлении). Кстати, в приложении появился еще одни новый файл packages.config, который, как раз, и содержит информацию об установленных пакетах. У меня в приложении он имеет теперь вид:
Ясно всё и понятно, что отображает этот файл.
Использование пакетов
Хочу отметить некоторую специфику в работе с пакетами. Дело в том, что пакеты это нечто иное, как просто файлы подгруженные к Вашему проекту с учетом некоторых параметров. Например, мой файл SimpleIoC.cs появляется в проекте с учетов namespace. Процесс подмены шаблона используется тот же, что использует Visual Studio, при создании нового проекта из шаблона (или файла из шаблона). Про свойства в таких шаблонах можно почитать хранилище знаний.
NuGet “умеет” добавлять и удалять сборки, файлы, папки, но при одном условии. Если папка, файл или сборка не поменяла название (содержание). Раз уж я установил пакет, то я могу его и удалить:
NuGet
Создание пакета NuGet
Пакет NuGet можно создать двумя способами. Мы рекомендуем использовать более новый подход — создавать пакет из проекта в стиле SDK (это файл проекта, содержимое которого начинается с
✔ РЕКОМЕНДУЕТСЯ использовать файл проекта в стиле SDK для создания пакета NuGet.
Зависимости пакетов
Важные метаданные пакета NuGet
Пакет NuGet поддерживает многие свойства метаданных. В следующей таблице собраны основные метаданные, которые должен предоставлять каждый пакет на NuGet.org.
Проект без лицензии по умолчанию получает статус монопольного авторского права, то есть не может законно использоваться другими пользователями.
✔ РЕКОМЕНДУЕТСЯ выбрать имя пакета NuGet с префиксом, который соответствует критериям для резервирования префикса NuGet.
✔️ СЛЕДУЕТ использовать атрибут href для определения HTTPS-ссылки, указывающей на значок пакета.
NuGet.org и другие аналогичные сайты работают с поддержкой HTTPS, поэтому при отображении изображения с другим протоколом появится предупреждение о смешанном типе содержимого.
✔️ СЛЕДУЕТ использовать для значка пакета изображение размером 64 × 64 с прозрачным фоном, чтобы обеспечить оптимальную видимость.
✔ РЕКОМЕНДУЕТСЯ настроить Source Link, чтобы добавить метаданные системы управления версиями в сборки и пакет NuGet.
Source Link автоматически добавляет метаданные RepositoryUrl и RepositoryType в пакет NuGet. Source Link также добавляет сведения о точном исходном коде, из которого создан пакет. Например, к пакету, созданному из репозитория Git, будет добавлен хэш фиксации в качестве метаданных.
Пакеты предварительного выпуска
Пакеты NuGet с суффиксом версии получают статус предварительной версии. По умолчанию в пользовательском интерфейсе диспетчера пакетов NuGet отображаются только стабильные выпуски, если пользователь не согласился использовать пакеты предварительной версии. Благодаря такой политике пакеты предварительной версии предоставляются для тестирования ограниченному числу пользователей.
В пакетах стабильных выпусков нельзя указывать зависимости от пакетов предварительной версии. В таком случае переведите используемый пакет в режим предварительной версии или укажите зависимость от более ранней стабильной версии.
✔️ СЛЕДУЕТ опубликовать пакет в режиме предварительной версии для тестирования, предварительного просмотра или экспериментов.
✔️ СЛЕДУЕТ опубликовать стабильный выпуск пакета, когда он будет полностью готов, чтобы другие стабильные пакеты могли содержать ссылки на него.
Пакеты символов
NuGet.org размещает свой собственный репозиторий сервера символов. Разработчики могут использовать символы, опубликованные на сервере символов NuGet.org, добавив https://symbols.nuget.org/download/symbols в источники символов в Visual Studio.
Сервер символов NuGet.org поддерживает только новые файлы переносимых символов ( *.pdb ), созданные проектами в стиле пакетов SDK.
Альтернатива созданию пакета символов — внедрение файлов символов в главный пакет NuGet. Главный пакет NuGet будет больше, но внедренные файлы символов позволяют разработчикам не настраивать сервер символов NuGet.org. Если вы создаете пакет NuGet из проекта в стиле SDK, файлы символов в него можно внедрить с помощью свойства AllowedOutputExtensionsInPackageBuildOutputFolder :
✔️ РЕКОМЕНДУЕТСЯ опубликовать символы в виде пакета символов ( *.snupkg ) на веб-сайте NuGet.org.
Благодаря пакетам символов ( *.snupkg ) разработчики получают эффективную среду отладки по требованию, причем при этом не увеличивается размер основного пакета и не снижается производительность восстановления в тех случаях, когда отладка пакета NuGet не предполагается.
Автоматизированное создание NuGet-пакетов
Коль захотел ты сборки передать
И с ними пламенный привет
Нугетом не забудь запаковать
В пакет!
Часто так бывает, что какое-то подмножество проектов начинает использоваться в разных решениях.
Как правило, программисты, разглядев в соседнем проекте что-то полезное, первое время не заморачиваются — создают папку lib (dll, assemblies и т.п.) и складывают туда скомпилированные сборки из оригинального решения. Со временем становится понятно, что это не самый удобный вариант и вот почему:
Изготовление NuGet-пакетов
Процесс изготовления NuGet-пакетов довольно прост. Вся общая теоретическая часть доступна и, в целом, понятна. В пакеты можно упаковывать различный контент, не только скомпилированные сборки, но и отладочные символы, картинки и т.п. ресурсы, и даже исходный код.
В данном описании мы ограничимся наиболее насущным вопросом упаковки скомпилированных сборок.
Подготовка первого NuGet-пакета
Для того, чтобы наладить автоматизированное создание NuGet-пакетов на сервере построения, надо «состряпать» первую версию пакета. Самый простой и понятный способ создания пакета – это использование NuSpec-файла, который описывает, что это будет за пакет. Получить данный NuSpec-файл можно разными способами:
Для примера, один из наших NuSpec-файлов с сокращениями выглядит как-то так:
Вот небольшие пояснения, касающиеся некоторых секций:
Таким образом мы должны получить заветный «первый пакет», или «опытный образец пакета», то есть nupkg-файл, который можно использовать для установки в проекты через NuGet Package Manager или через NuGet.exe.
Выставка готовых пакетов
Итак, у нас есть пакет, который надо как-то доставлять пользователям через какой-нибудь «канал сбыта пакетов». Считаем, что большинство пользователей будут устанавливать пакеты через Visual Studio. Встроенный в неё NuGet Package Manager понимает два варианта размещения пакетов:
Самый простой вариант для распространения пакетов – создать сетевую папку и складывать пакеты туда.
Стоит отметить, что NuGet позволяет работать не только с общей галереей пакетов https://nuget.org, но и создавать собственные галереи, для этого можно развернуть где-то у себя тот же движок, что используется на https://nuget.org. Наша команда предпочитает этот вариант, поскольку в этом случае появляется возможность отслеживания статистики загрузок, управление полномочиями через сайт, в конце концов, это просто красиво.
Установка галереи может потребовать небольших танцев с бубном, как минимум, в вопросе авторизации, но ничего сложного в этом нет. Публикация пакетов происходит точно так же, как и на NuGet.org, важно при обновлении сайта галереи не потерять архив с уже загруженными пакетами – они хранятся в каталоге узла. Настройка NuGet Package Manager для пользователей в этом случае будет выглядеть как-то так:
Если локальный источник пакетов находится где-то рядом с пользователями, например, в одной локальной сети, то рекомендуется закачать в него все пакеты с зависимостями – это сократит время скачивания пакетов для новых пользователей. Найти nupkg-файлы от зависимых пакетов очень легко – они всегда есть в папке packages, в которую устанавливаются эти самые пакеты (обычно в каталоге с sln-файлом). Также в окне настроек источников пакетов важен порядок – студия будет перебирать источники в случае восстановления пакетов в том порядке, который указан в настройках. Следовательно, если ваш пакет доступен только локально, то первым поставьте свой источник, чтобы не было лишних запросов на nuget.org.
Фабрика по производству NuGet-пакетов
После того, как «опытный образец пакета» сделан и «канал сбыта пакетов» налажен, можно приступать к автоматизации сборки пакетов, чтобы по первому же щелчку мышки мы могли получить горячий и самый свежий NuGet-пакет.
Рассмотрим, как это делается в случае с Team Foundation Server 2013/2015. Для других подобных CI-систем процесс будет похожим.
В свойствах Build Definition (XAML) можно указать PowerShell-скрипт, который выполнится в случае успешного выполнения построения. Именно в этом скрипте и будем вызывать наш «упаковщик», передавая в качестве параметра путь до NuSpec-файла.
Есть несколько моментов, которые следует прояснить для себя: где будет лежать сам NuGet.exe и все необходимые ему файлы (как минимум, конфигурационный файл), где будет находиться NuSpec-файл? С одной стороны, можно положиться на то, что на сервере построения будет в определённом месте расположен NuGet.exe, но если серверов построения несколько и их администрированием заниматься нет желания, то проще всего положить NuGet.exe в Source Control и добавить каталог с его расположением в Workspace, с которым будет выполняться построение. Что касается NuSpec, то его удобно держать рядом с sln-файлом и даже включить в Solution Items для быстрого доступа к нему через Solution Explorer.
Если имеется несколько солюшенов и планируется создавать несколько пакетов, то рекомендуется реализовать один общий PowerShell-скрипт, который будет в качестве параметра получать путь до NuSpec-файла.
Ниже представлены выдержки из такого скрипта:
В скрипте выполняются операции по преобразованию относительных путей в абсолютные (можно без труда найти описание доступных переменных, которые означаются CI-системой при запуске скрипта). В некоторых случаях требуется модификация NuSpec-файла в этом скрипте. Например, таким образом можно обработать создание пакетов для различных конфигураций (Any CPU, x86).
На этом, собственно, настройка автоматического механизма создания NuGet-пакетов заканчивается. Запускаем сборку на сервере построения, проверяем, что всё сработало. Для получения отладочной информации, если что-то пошло не так, не забываем писать –Verbose в параметрах скрипта в настройках определения построения. Готовые пакеты заливаем в общий ресурс или галерею и приглашаем первых пользователей.
Тонкости процесса
Кроме возможностей по созданию NuGet-пакетов, скрипт для сервера построения для каждого из пакетов может запускать утилиту генерации автодокументации на основе XML-комментариев в коде. Данная возможность удобна в том плане, что для каждой версии пакета у нас появляется своя версия автодокументации, это удобно, если пользователи применяют разные версии NuGet-пакетов. Для генерации автодокументации у нас применяется Doxygen. Вот раздел скрипта, посвящённый автодокументации:
Можно создавать свои конфигурации, что мы и делаем. К сожалению, чтобы выполнить «тонкую» настройку всех необходимых параметров, придётся открыть csproj-файл и, как минимум, прописать там TargetFrameworkVersion в каждой из секций конфигурации.
Конфигурации в Visual Studio переключаются в основном тулбаре, в определении сборки на сервере можно выбрать одновременно несколько конфигураций, которые будут компилироваться последовательно.
При этом константы должны быть определены в соответствующей секции csproj-файла:
Пример секции files в NuSpec-файле:
Ещё одна проблема, с которой можно часто столкнуться при использовании (даже не при создании) NuGet-пакетов — проблема подключения одного проекта в несколько солюшенов. Дело в том, что в csproj-файле ссылки на сборки проставляются вплоть до конкретных dll, которые по умолчанию восстанавливаются Visual Studio в папку packages рядом с sln-файлом. Отсюда возникает проблема, когда один и тот же проект включён в несколько солюшенов, располагающихся в разных папках. Для решения этой проблемы можно воспользоваться NuGet-пакетом, который включает в себя специальный Target, который переписывает ссылки перед билдом: https://www.nuget.org/packages/NuGetReferenceHintPathRewrite.
Ещё одной особенностью использования NuGet-пакетов является тема восстановление пакетов при сборке. Дело в том, что до некоторых пор Visual Studio не имела встроенных средств восстановления пакетов, поэтому в csproj дописывался специальный Target, который отвечал за восстановление. В современных Visual Studio (2013+) это уже не актуально, следите за чистотой своих csproj-файлов, никаких Target-ов для восстановления NuGet-пакетов больше не требуется.
Результат
Итак, выполнив всё, что описано в предложенной нами инструкции, вы можете получить готовый механизм упаковки пакетов, который работает без участия человека. Наши пакеты собираются именно так. Разве что, сама публикация требует некоторого внимания.