2. Зачем городить огород?
С каждым месяцем всё больше становится
разнообразных библиотек программного кода – от
минимальных до универсальных
Множится их количество
И каждая из них раз в месяц или в квартал
выпускает обновленную версию
Соответственно, встает новая задача –
централизованное управление множеством
разнообразных библиотек, которые использует
ваш проект (или проекты)
3. Пакеты NuGet
Кому это нужно?
Общедоступная лента NuGet.org – всем, кто пишет
OpenSource проекты, и всем, кто использует
OpenSource проекты
Частные ленты (сервера) NuGet –
компаниям, которые хотят использовать свои
внутренние библиотеки более структурировано
4. Что такое пакет?
библиотека .NET, которую кто-то внимательно и
аккуратно подготовил для использования во
внешних проектах
А также некоторая конфигурация, которая
необходима для использования этой библиотеки
И некоторые подготовительные действия, которые
нужны для её использования
И некоторые куски кода
Или - только библиотека. Или – только
конфигурация. Или – только куски кода.
5. Откуда приходят пакеты?
Кто запрашивает пакет Кто отдает пакет Кто создает пакет
(package feeds)
Package
Manager UI
http://NuGet.org
Package
Manager
Console
DevServerNuGet
Собственно,
мы.
Nuget.exe
https://nuget.mycompany.com/
7. Пакет установлен. Куда?
В корне каждого из проектов внутри солюшена
хранится файл packages.config, хранящий имя и
точную версию необходимого пакета
Все пакеты, используемые в солюшене, хранятся в
папке packages, расположенной в одной директории с
файлом солюшена.
Каждый пакет хранится в папке вида <имя>.<версия>.
Внутри папки находятся распакованные бинарные
файлы библиотек и сам файл пакета *.nupkg
Также в этой папке находится файл
repositories.config, хранящий относительный путь к
конфигурационному файлу пакетов проекта.
8. Пакет установлен. И что дальше?
Существует два варианта работы с пакетами в системах
контроля версий:
- Пакет и его содержимое помещаются в хранилище кода.
Преимущество: каждый разработчик, забирая рабочую
копию, получает полностью работоспособную копию.
Недостаток: может занимать большой объем данных в
репозитории, особенно – в случае распределенных
файловых систем и в случае многочисленных ветвлений
- Пакеты не помещаются в хранилище кода, помещается лишь
информация о необходимых пакетах; сами же пакеты
автоматически скачиваются из лент пакетов в момент билда
солюшена. Начиная с версии NuGet 1.6, этот сценарий
полностью поддерживается «из коробки»
10. Что такое пакет? Вторая серия.
Тут сидят программисты, знаете ли.
Единый файл для скачивания и хранения -
CoolLibrary.2.0.1.nupkg (но на самом деле это zip)
CoolLibrary.nuspec – спецификация пакета (XML)
Web.config.transform – преобразование
конфигурационного файла (XSLT-подобное)
Каталог lib – скомпилированная библиотека (или
несколько версий библиотеки для разных версий .NET
Framework)
Каталог tools – PowerShell-скрипты, выполняемые при
установке пакетов
Каталог src – иерархия шаблонов файлов кода
Каталог content – иерархия файлов, копируемых в
целевой проект как есть
11. Спецификация пакета nuspec
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>Castle.Windsor</id>
<version>2.5.4</version>
<title>Castle.Windsor</title>
<authors>Castle Project Contributors</authors>
<owners />
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
<projectUrl>http://docs.castleproject.org/Windsor.MainPage.ashx</projectUrl>
<iconUrl>http://www.castleproject.org/images/wc_logo32.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Castle Windsor is best of breed, mature Inversion of Control container
available for .NET and Silverlight.</description>
<summary>Castle Windsor is best of breed, mature Inversion of Control container
available for .NET and Silverlight.</summary>
<tags>castle windsor inversionOfControl DependencyInjection</tags>
<dependencies>
<dependency id="Castle.Core" version="2.5.2" />
</dependencies>
</metadata>
</package>
12. Пакет, вид изнутри
NuGet Package Explorer – утилита с
пользовательским интерфейсом для просмотра,
редактирования и создание NuGet-пакетов
http://nuget.codeplex.com/releases
Также позволяет открыть любой пакет напрямую
из ленты пакетов или опубликовать вновь
созданный пакет на NuGet.org
15. Публикуем наши пакеты
Путь для ленивых – подключение пакетов из папки
(локальной или сетевой)
16. Отправка пакетов на NuGet.org
Регистрируемся на NuGet.org
Получаем API Key
Сохраняем его на нашей машине
Отправляем наш пакет в общую галерею в один
щелчок. (Или в несколько. Или из командной
строки, но одной командой. Но все равно –
действительно быстро.)
Новая версия пакета доступна в галерее
(Все старые версии также по-прежнему
доступны)
18. Создание собственной ленты
Устанавливается в любой VS-веб-проект как пакет
NuGet
NuGet.Server 1.6.1 (на момент написания)
Предоставляет read-only версию ленты пакетов с
доступом по http(s)
Разворачиваем получившийся веб-сайт на IIS
Добавляем новые пакеты в папку Packages внутри этого
сайта
Эти пакеты автоматически попадают в ленту
Можно обеспечить безопасность корпоративной ленты
– поддерживается Windows-аутентификация при
подключении к ленте, поддерживается https-протокол
(только валидные сертификаты!)
20. Упрощение обновления
Можно централизованно обновлять версию
библиотеки для всего солюшена, а не
индивидуально для каждого проекта
При необходимости – автоматическое создание
записей перенаправления версий в .config –файлах
(не стоит, однако, думать, что проблема версий
решена раз и навсегда. И здесь не обошлось без
подводных камней! Например – когда два
используемых пакета требуют разных версий
третьего пакета)
23. Доступность исходников пакетов
Крайне актуально для отладки OpenSource-
приложений
Мы имеем возможность не только выгружать на
NuGet.org сам пакет, но и автоматически
синхронно отправлять исходный код на
http://srv.symbolsource.org/pdb/Public
Любой пользователь Visual Studio может
подключить этот сервер как хранилище исходных
кодов и совершенно прозрачно отлаживать код по
загруженным исходникам
24. Диапазоны версий зависимостей
Начиная с версии 1.6, можно указывать как точные версии пакетов,
от которых зависит ваш пакет, так и диапазоны.
1.0 = 1.0 ≤ x
(,1.0] = x ≤ 1.0
(,1.0) = x < 1.0
[1.0] = x == 1.0
(1.0) = invalid
(1.0,) = 1.0 < x
(1.0,2.0) = 1.0 < x < 2.0
[1.0,2.0] = 1.0 ≤ x ≤ 2.0
empty = latest version.
Поддержка нестабильных версий ПО – версия пакета
обозначается тире и произвольной строкой
1.0.1-alpha
25. Инфраструктурные пакеты
WebActivator – пакет, созданный для облегчения
создания других пакетов
Помогает внедрять в веб-приложения
действия, которые должны выполняться в момент
старта или выгрузки приложения
Облегчает создание такого кода за счет того, что он
может быть локализован в независимых файлах
вместо встраивания в global.asax
26. Шаблоны VS с зависимостями на
пакеты NuGet
Введено в версии 1.6
27. Вопросы?
Внимательно слушаю!
Андрей Кулешов
«Деловые решения»
Директор
akuleshov@solforbiz.com akuleshov.tula
http://www.solforbiz.com
Специально для http://GetDev.NET
28. Интересное чтение
NuGet Docs
http://docs.nuget.org/
Дэвид Эббо – блог разработчика NuGet
http://blog.davidebbo.com/
Tips for building Nuget packages
http://lostechies.com/joshuaflanagan/2011/06/23/tips-
for-building-nuget-packages/
29. Интересное видео
В первую очередь:
NuGet In Depth: Empowering Open Source on the .NET
Platform
http://channel9.msdn.com/Events/MIX/MIX11/FRM09
Во вторую очередь:
Всё, перечисленное на:
http://docs.nuget.org/docs/start-here/videos
По желанию:
Решение задачи централизованного доступа команды
разработчиков к компонентам разработки приложений
с помощью NuGet
http://www.techdays.ru/videos/3926.html