Основы. Часть 4 – Использование NuGet

Прежде чем приступить к разработке основного демонстрационного проекта, давайте рассмотрим один из инструментов, который поставляется совместно с ASP.NET MVC 3.

Задачи NuGet

Как было было отмечено в прошлой части, ASP.NET MVC 3 использует NuGet для работы с библиотеками. Этот инструмент позволяет упростить процесс их установки, обновления и, при необходимости, удаления.  Используя графический или консольный интерфейс, разработчику всего лишь необходимо дать соответствующую команду. NuGet самостоятельно:

  • по названию найдет в интернете нужный установочный пакет;
  • загрузит его с учетом зависимостей от других библиотек;
  • распакует и проверит целостность;
  • добавит в проект ссылки (reference) на сборки;
  • при необходимости, модифицирует файлы конфигурации проекта.

Звучит внушительно?

Однако за всей этой простой можно упустить один очевидный, но очень важный момент: при обновлении библиотеки NuGet не проверяет совместимость новой версии и существующего кодом. Поэтому по прежнему необходимо читать описание изменений в библиотеке.

NuGet не является частью ASP.NET MVC 3 и может использоваться в проектах другого типа. При этом он может быть установлен как в Visual Studio 2010, так и в бесплатных версиях: Visual Web Developer 2010, Visual Studio C# Express.

При необходимости установить NuGet без ASP.NET MVC 3, его можно загрузить через менеджер дополнений Visual Studio или с официального сайта: http://nuget.codeplex.com/

Локальное хранилище установочных пакетов

Установленные библиотеки размещаются в отдельных папках, которые располагаются в папке packages. Последняя, в свою очередь, находится в корневой папке решения (solution).

Чтобы избежать повторной загрузки установочных пакетов, NuGet использует локальный кэш. Он создается отдельно для каждого пользователя операционной системы и размещается по адресу:
C:\Users\%userName%\AppData\Local\NuGet\Cache.

Графический интерфейс "Add Library Package Reference"

Для использования графического интерфейса необходимо открыть диалоговое окно "Add Library Package Reference". Для этого в Solution Explorer или Solution Navigator в контекстном меню проекта нужно выбрать одноименный пункт. Кроме того, он также доступен в через подменю Project в главном меню Visual Studio.

NuGet Add Library Package Reference dialogВ диалоговом окне NuGet слева расположен перечень разделов:

  • Installed packages – содержит список установленных библиотек;
  • Online – обеспечивает доступ к каталогу установочных пакетов;
  • Updates – выводит список обновлений, доступных для установленных библиотек;
  • Recent packages – перечисляет последние использованные установочные пакеты.

Для списков Online и Updates доступен выбор источников (т.е. сервера откуда будут взяты данные об установочных пактах). Изменить их перечень можно в окне настройки NuGet.

В центральной части выводится список доступных в данном разделе установочных пакетов. При выборе любого их них, рядом с его названием отображается кнопка действия: установить, обновить или удалить.

Справа доступно описание выбранной библиотеки. Обратите внимание, что кроме названия, автора, версии, рейтинга и описания также содержится список установочных пакетов от которых она зависит. В случае необходимости они также будут загружены вместе с ней.

Консоль "Package Manager Console"

Другим вариантом взаимодействия с NuGet является консоль. Она подойдет тем разработчикам, которым удобнее работать с командой строкой. Кроме того, она предоставляет больше возможностей, чем предыдущий вариант графическим интерфейсом.

Для того, чтобы открыть Package Manager Console можно воспользоваться меню View > Other Windows и выбрать в нем одноименный пункт. Также доступны другие варианты: Tools > Library Package Manager или кнопка на панели инструментов Visual Studio.

После загрузки и инициализации PowerShell, который используется для работы данного интерфейса, окно консоли будет выглядеть следующим образом:

NuGet Package Manager Console

В его верхней части расположены списки для указания источника данных и проекта по умолчанию. При этом для отдельной команды эти значения могут быть переопределены её параметрами.

Стоит отметить, что при вводе поддерживается завершение набранных команд и названий установочных пакетов. Для этого необходимо нажать кнопку Tab и NuGet отобразит список с возможными вариантами. В случае если вариант только один, то он сразу будет подставлен в вводимую строку.

Рассмотрим доступные команды и их параметры:

Get-Package – вывод списка установочных пакетов
[Без параметров] Выводит список установленных пакетов.
‑Source sourceUrlOrPath Определяет источник для получения информации о пакетах. Это может быть RSS поток, папка на диске или сервис, поддерживающий OData.
-ListAvailable [filterSpecification] Отображает список библиотек, доступных в выбранном источнике. Возможна установка фильтра, который применяется для названий и описаний библиотек.
‑Updates Отображает список библиотек, для которых доступны обновления.
‑Recent Выводит список последних установленных библиотек.
‑First N Отображает первые N установочных пакетов в списке.
‑Skip N Пропускает N установочных пакетов при выводе списка. Вместе с параметром –First позволят выводить список частями. Например, чтобы вывести названия библиотек с 15 по 45 необходимо указать "–Skip 15 –First 30"
‑Filter filterSpecification Устанавливает фильтр для вывода списка библиотек как установленных, так и на доступных в источнике. Применяется к названию и описанию библиотеки.
Install‑Package – установка библиотек

‑Id packageName

Обязательный первый параметр (при этом можно опустить "–Id"). Задает имя установочно пакета. При этом если не ввести имя показывается 30 самых библиотек с самым большим рейтингом. Если указать часть имени, то осуществляется поиск по вхождению указанного текста в имена библиотек.
‑IgnoreDependencies Указывает необходимость установки только указанной библиотеки, игнорируя её зависимости от других.
‑Project projectName Определяет в какой из проектов необходимо установить библиотеку. По умолчанию используется проект текущий проект, указанный в окне консоли.
‑Source sourceURL Указывает источник получения установочного пакета.
‑Version versionNumber Запрашивает установку указанной версии библиотеки (по умолчанию используется самая последняя).
Uninstall‑Package – деинсталляция библиотек

‑Id packageName

Обязательный первый параметр (при этом можно опустить "–Id"). Определяет имя библиотеки для удаления.
‑RemoveDependencies Указывать не необходимость так же удалить пакеты, от которых зависит библиотека и которые не используются другими.
‑Force Удаляет библиотеку, даже если есть зависимые от неё компоненты.
‑Version versionNumber Указывает версию удаляемой библиотеки. По умолчанию выбирается самая последняя версия.
‑Project projectName Определяет из какого проекта удаляется библиотека. По умолчанию используется проект текущий проект, указанный в окне консоли.
Update-Package – обновление установленных библиотек

‑Id packageName

Первый параметр (при этом можно опустить "–Id"). Определяет имя библиотеки, для которой производится поиск и установка обновления. Если он не указан, то производится обновление всех библиотек.
‑UpdateDependencies При установке этого флага производится обновление всех зависимых библиотек.
‑Project projectName Определяет в каком проекте будет обновлены библиотеки. Если ключ не указан, то выбранный пакет или все пакеты обновляются во всех проектах решения.
‑Source sourceURL Переопределяет источник получения установочного пакета для данной команды.
‑Version versionNumber Указывает версию до которой происходит обновление. По умолчанию выбирается самая последняя версия.
‑Safe Задействует безопасное обновление, т.е. загружаются только минорные обновления. Например: установлена версия 1.0.0 и доступны 1.0.1, 1.0.2 и 1.1. При использовании ключа –safe будет загружена версия 1.0.2, а без него – 1.1.
Open-PackagePage – переход на страницу проекта

‑Id packageName

Обязательный первый параметр (при этом можно опустить "–Id"). Определяет имя библиотеки, страница которой будет открыта в браузере.
‑Version versionNumber Указывает номер версии.
‑Source sourceURL Переопределяет источник получения установочного пакета для данной команды.
‑License Открывает в браузере страницу с лицензионным соглашением.
‑ReportAbuse Открывает в браузере страницу для подачи жалобы.
‑PassThru

Изменяет поведение команды. Вместо открытия браузера возвращается строка с адресом выбранной страницы. Например, следующий код присваивает переменной $url ссылку на страницу с текстом лицензии:
$url = Open-PackagePage Ninject -License -WhatIf -PassThru

Get–Projects – выбор проекта(ов) (для конвейера команд)
[Без параметров] Возвращает текущий проект.

-All

Возвращает все проекты загруженного решения (solution).
‑Name projectName Возвращает заданный проект для команды.

Вот несколько примеров:

  • Get-Package -ListAvailable jQuery – выводит список всех доступных установочных пакетов, у которых в имени или описании есть текст "jQuery".
  • Get-Package –ListAvailable -Skip 5 -First 10 jQuery – отображает перечень с 5 по 15 библиотеку, в названии которых содержится слово "jQuery".
  • Get-Package -Update -Filter jQuery – отображает список обновлений, доступных для установленных проектов в названии которых содержится слово "jQuery".
  • Install-Package jQue[нажатие кнопки "Tab"] – откроет окно подсказки с списком библиотек, имена которых начинаются с текста "jQue". Обратите внимание на возможность пропускать указание "–Id".
  • Update-Package – обновляет все установочные пакеты во всех проектах текущего решения.
  • Update-Package EntityFramework – обновляет пакет EntityFramework во всех проектах решения.
  • Update-Package –ProjectName BookCatalog – обновляет все пакеты в проекте BookCatalog.
  • Update-Package EntityFramework -ProjectName BookCatalog – обновит библиотеку EntityFramework в только проекте BookCatalog.

Кроме того NuGet позволяет создавать собственные источники и установочные пакеты. Это упрощает р��змещение своих проектов в интернете и создание локальных репозиториев. Подробно эти возможности рассмотрены в серии статей "Использование NuGet". Ну а в следующей части приступим к разработке демонстрационного проекта.

Комментарии (11) -

Максим 30.05.2011 14:55:05

Андрей, спасибо за статью! В связи с ней появился вопрос: может ли сей мощный инструмент помочь в следующем?
В проекте, библиотеки jquery и jquery.ui и другие часто используемые, хранятся без указания версии в названии. Т.о. при ручном обновлении содержимого библиотеки на новую версию можно не редактировать во вьюшках имена библиотек.
Nuget же устанавливает и обновляет билиотеки вместе с версией в названии. Можно ли с помощью фильтров или иных настроек реализовать вышеприведенный вариант?

Не сталкивался с такой необходимостью. Что-то мне подсказывает что нельзя. Дело в том, что имена файлов в библиотеках задаются авторами. NuGet накладывает требования только на имя установочного пакета, которое к проекту никак не относится. Таким образом – только писать авторам пакетов jQuery c предложением или сделать локальный репозиторий и самому (пере)собирать установочные пакеты.

Александр 31.12.2011 4:45:49

Думаю можно создать новый пакет с помощью NuGet Package Explorer http://nuget.codeplex.com/releases/view/59864

В зависимостях которого будет нужный. И добавить power shell script, переименовывающий файлы.

Подскажите - что надо сделать, чтобы новый проект (например MVC3) сразу создавался с новым jQuery и т.д.

@ Сергей: Создать свой шаблон. Однако по большому счету это не имеет смысла, т.к. версии выходят достаточно часто. Проще сразу после создания проекта обновить библиотеки командой update-package.

Павел 11.06.2013 17:55:57

"упустить один один очевидный" - дублирующееся слово "один".

@ Павел: Спасибо за внимательность.

С помощью NuGet можно делать пакет развертывания а-ля: www.iis.net/.../package-an-application-for-the-windows-web-application-gallery
?

Сергей, не сталкивался. Но скорее всего нет, т.к. у NuGet своя структура размещения файлов внутри контейнера.

Вадим 18.07.2016 7:13:32

Долго искал, но так и не нашел ответа, как изменить путь к локальному хранилищу пакетов.  Программа фактически становится не портируемой из-за привязанности к C:\Users\[User]\Documents\Visual Studio\Projects\[Project]\packages\[Framework]

Вадим Не совсем понял ваш вопрос. Если вы создали локальное хранилище, по указанному адресу то используйте его ��о имени. Не прописывая в проектный конфиг NuGet. Для свободного переноса проекта между разными рабочими станциями используйте ресурс - доступный одинаково со всех станций (ответ конечно в стиле КО, но все же я не уверен что понял ваш вопрос).

Добавить комментарий