Пакеты в шаблонах Visual Studio
Шаблонам проектов и элементов Visual Studio часто требуется обеспечить установку определенных пакетов при создании проекта или элемента. Например, шаблон ASP.NET MVC 3 устанавливает jQuery, Modernizr и другие пакеты.
Для этого авторы шаблонов могут настроить NuGet для установки необходимых пакетов, а не отдельных библиотек. Позднее разработчики могут в любое время легко обновить эти пакеты.
Дополнительные сведения о создании шаблонов см. в разделе Практическое руководство. Создание шаблонов проектов и Создание настраиваемых шаблонов проектов и элементов.
Оставшаяся часть этого раздела посвящена конкретным шагам, которые следует предпринять при создании шаблона, чтобы правильно включить пакеты NuGet.
Примеры
Пример предварительно установленных пакетов доступен в репозитории NuGet/Samples на сайте GitHub.
Добавление пакетов в шаблон
При создании шаблона вызывается мастер шаблонов для загрузки списка устанавливаемых пакетов, а также сведений об их расположении. Пакеты могут быть внедрены в VSIX, в шаблон или расположены на локальном жестком диске, в случае чего вы используете раздел реестра, чтобы сослаться на путь к файлу. Сведения об этих расположениях приведены ниже в этом разделе.
Предустановленные пакеты используют для работы мастеры шаблонов. Специальный мастер вызывается при создании экземпляра шаблона. Он загружает список пакетов, которые нужно установить, и передает эти сведения соответствующим API NuGet.
Шаги по включению пакетов в шаблон:
Добавьте в свой файл
vstemplate
ссылку на мастер шаблонов NuGet, добавив элементWizardExtension
:<WizardExtension> <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly> <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName> </WizardExtension>
NuGet.VisualStudio.Interop.dll
— это сборка, содержащая только классTemplateWizard
, который представляет собой простую программу-оболочку, вызывающую фактическую реализацию вNuGet.VisualStudio.dll
. Версия сборки не изменится, поэтому эти шаблоны проектов и элементов продолжат работать с новыми версиями NuGet.Добавьте список устанавливаемых пакетов в проект:
<WizardData> <packages> <package id="jQuery" version="1.6.2" /> </packages> </WizardData>
Мастер поддерживает несколько элементов
<package>
, что обеспечивает поддержку нескольких источников пакетов. Требуются оба атрибутаid
иversion
, то есть эта конкретная версия пакета будет установлена, даже если доступна более новая версия. Это не позволяет обновлениям пакета нарушить работу шаблона и предоставляет возможность обновить пакет разработчику, использующему шаблон.Укажите репозиторий, где NuGet может найти пакеты, как описано в следующих разделах.
Репозиторий пакетов VSIX
Для развертывания шаблонов проектов и элементов Visual Studio рекомендуется использовать расширение VSIX, так как оно дает возможность упаковать вместе несколько шаблонов проектов или элементов и позволяет разработчикам легко находить ваши шаблоны с помощью диспетчера расширений VS или коллекции Visual Studio. Обновления для этого расширения также легко развернуть с помощью механизма автоматического обновления в диспетчере расширений Visual Studio.
Сам VSIX может служить источником необходимых шаблону пакетов:
Измените элемент
<packages>
в файле.vstemplate
следующим образом:<packages repository="extension" repositoryId="MyTemplateContainerExtensionId"> <!-- ... --> </packages>
Атрибут
repository
задает тип репозитория какextension
, аrepositoryId
является уникальным идентификатором самого VSIX (это значение атрибутаID
в файлеvsixmanifest
расширения, см. Справочник по схеме 2.0 расширения VSIX).Поместите файлы
nupkg
в папкуPackages
внутри VSIX.Добавьте нужные файлы пакетов как
<Asset>
в файлvsixmanifest
(см. Справочник по схеме 2.0 расширения VSIX).<Asset Type="Moq.4.0.10827.nupkg" d:Source="File" Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />
Обратите внимание, что можно доставить пакеты в тот же VSIX, что и шаблоны проекта, либо поместить их в отдельный VSIX, если это лучше подходит для вашего сценария. Однако не следует ссылаться на любой VSIX, которым вы не управляете, так как изменения в этом расширении могут нарушить работу шаблона.
Репозиторий пакетов шаблонов
Если вы распространяете только один шаблон проектов или элементов и вам не нужно паковать вместе несколько шаблонов, можно использовать более простой, хотя и ограниченный, подход, включающий пакеты непосредственно в ZIP-файл шаблона проектов или элементов:
Измените элемент
<packages>
в файле.vstemplate
следующим образом:<packages repository="template"> <!-- ... --> </packages>
Атрибут
repository
имеет значениеtemplate
, а атрибутrepositoryId
не является обязательным.Поместите пакеты в корневую папку в ZIP-файле шаблона проектов или элементов.
Обратите внимание, что применение такого подхода для VSIX, содержащего несколько шаблонов, приводит к ненужному раздуванию, когда один или несколько пакетов являются общими для шаблонов. В таких случаях используйте VSIX в качестве репозитория, как описано в предыдущем разделе.
Путь к папке, указанный для реестра
Пакеты SDK, устанавливаемые с помощью MSI, могут устанавливать пакеты NuGet непосредственно на компьютере разработчика. В результате их не требуется извлекать при использовании шаблона проектов или элементов, они доступны сразу же. Этот подход используется в шаблонах ASP.NET.
Позвольте MSI установить пакеты на компьютере. Вы можете установить файлы
.nupkg
отдельно либо вместе с расширенным содержимым, которое позволяет пропустить один из шагов при использовании шаблона. В этом случае следуйте стандартной структуре папок NuGet, когда файлы.nupkg
находятся в корневой папке, а каждый пакет имеет вложенную папку, имя которой состоит из пары идентификатора и версии.Запишите раздел реестра для определения расположения пакета:
- Расположение ключа: либо на уровне компьютера
HKEY_LOCAL_MACHINE\SOFTWARE[\Wow6432Node]\NuGet\Repository
, либо, если шаблоны и пакеты установлены для конкретного пользователя, можно также использоватьHKEY_CURRENT_USER\SOFTWARE\NuGet\Repository
. - Имя ключа: используйте уникальное имя. Например, шаблоны ASP.NET MVC 4 для Visual Studio 2012 используют
AspNetMvc4VS11
. - Значения: полный путь к папке пакетов.
- Расположение ключа: либо на уровне компьютера
Добавьте в элемент
<packages>
в файле.vstemplate
атрибутrepository="registry"
и укажите имя раздела реестра в атрибутеkeyName
.Если вы заранее распаковали пакеты, используйте атрибут
isPreunzipped="true"
.(NuGet 3.2+) Если вы хотите принудительно выполнить сборку времени разработки в конце установки пакета, добавьте атрибут
forceDesignTimeBuild="true"
.Для оптимизации добавьте
skipAssemblyReferences="true"
, так как шаблон уже включает в себя необходимые ссылки.<packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true"> <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" /> <-- ... --> </packages>
Рекомендации
Объявите о зависимости от NuGet VSIX, добавив ссылку на него в манифесте VSIX:
<Reference Id="NuPackToolsVsix.Microsoft.67e54e40-0ae3-42c5-a949-fddf5739e7a5" MinVersion="1.7.30402.9028"> <Name>NuGet Package Manager</Name> <MoreInfoUrl>http://learn.microsoft.com/nuget/</MoreInfoUrl> </Reference> <!-- ... -->
Настройте сохранение шаблонов проектов и элементов при их создании, включив
<PromptForSaveOnCreation>true</PromptForSaveOnCreation>
в файл.vstemplate
.Шаблоны не содержат файл
packages.config
, а также ссылки или содержимое, которое следует добавить при установке пакетов NuGet.