Создайте шаблон проекта Visual Studio, который извлекает ссылки NuGet из онлайн-фида

Я создаю шаблон проекта Visual Studio и связывает его внутри VS-расширения. Мне нужны проекты, созданные из шаблона, для ссылок на ~ 20 пакетов NuGet.

Возможно ли, чтобы ссылки были разрешены с помощью nuget.org, вместо того, чтобы включать все ссылки внутри VSIX?

Документация NuGet на Visual Studio Templates содержит инструкции по добавлению пакетов внутри VSIX, но для этого требуется, чтобы файл хранился локально на диск и .nupkg - это пакеты внутри vsix:

Добавьте свои файлы nupkg как пользовательский контент расширения в файл source.extension.vsixmanifest. Если вы используете схему 2.0, она должна выглядеть так:

<Asset Type="Moq.4.0.10827.nupkg" d:Source="File" 
    Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />

Вопрос уже задан

Я знаю, что был задан аналогичный вопрос (Создание шаблона проекта Visual Studio, который уже содержит ссылку на пакет Nuget?) и ответил (не представляется возможным), но это было спросил в 2011 году.

Через 5 лет это все еще невозможно?

Ответ 1

Так как по-прежнему нет встроенных функций для установки/обновления пакетов из онлайн-репо, вот небольшое обходное решение, которое может помочь:

Предпосылки

Сначала установите пакет NuGet.VisualStudio nuget в свой проект. Вы получите это от здесь

При установке пакет автоматически установит свойство Embed Interop Types ссылки на сборку True. Причина, по которой это делается, - сделать ваш код устойчивым к изменениям версии, когда пользователи будут обновлены до более новых версий NuGet.

По той же причине вы должны НЕ использовать любые другие типы, кроме вышеуказанных интерфейсов в вашем коде. Вы также НЕ должны ссылаться на любые другие сборки NuGet, включая NuGet.Core.dll.

После настройки всего этого, вы можете сделать следующее в RunFinished -Method:

var componentModel = (IComponentModel) Package.GetGlobalService(typeof(SComponentModel));
IVsPackageInstallerServices installerServices = 
     componentModel.GetService<IVsPackageInstallerServices>();

if (!installerServices.IsPackageInstalled(project, "Newtonsoft.Json")) {
     var installer = componentModel.GetService<IVsPackageInstaller>();
     installer.InstallPackage(
         "All", 
         project, 
         "Newtonsoft.Json", 
         (System.Version) null, 
         false);
}

Примечание

В этом примере показано на основе Newtonsoft.Json, как вы можете установить пакет. Конечно, вы можете выбрать проекты, предназначенные для установки. Также вы можете определить версию, которая будет установлена.

Кажется, немного неудобно, но, к сожалению, нет другого пути.

Usings

using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Shell;
using NuGet.VisualStudio;

Сообщите мне, если это поможет!

Ответ 2

Да, вы можете создать пакет nuget и добавить эти другие пакеты в качестве своих зависимостей. Затем, когда вы загрузите этот пакет, он получит все свои зависимости и добавит в ваш проект.