Как добавить пакеты nuget и запустить мастер специальных проектов?

Я построил собственный шаблон проекта. Когда проект создается с помощью шаблона, запускается пользовательский мастер, который позволяет пользователю редактировать созданный проект.

Проблема в том, что мне также нужно добавить в созданный проект несколько простых пакетов nuget (только mvvmlight, MyToolkit и еще 1). Для этого я добавил элемент WizardData на мой vstemplate с правильными пакетами.

Здесь возникает проблема: чтобы запустить мой мастер, мне нужно поместить ссылку на мой мастер внутри элемента WizardExtension. Но для автоматической установки пакетов nuget мне нужно поместить ссылку на NuGet.VisualStudio.TemplateWizard внутри моего элемента WizardExtension, а WizardExtension может иметь только один класс, который он будет создавать, но у меня есть 2, которые нужно запустить.

Итак, как я могу это решить?

Вот код, запускающий мой собственный мастер. Теперь мне также нужны пакеты NuGet для установки:

<WizardExtension>
    <Assembly>PartyTemplateWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=7eb2f41084fd4cd5</Assembly>
    <FullClassName>PartyTemplateWizard.Wizard</FullClassName>
</WizardExtension>
<WizardData>
    <packages repository="template">
        <package id="MvvmLight" version="4.1.27.0" />
        <package id="MvvmLightLibs" version="4.1.27.0" />
        <package id="MyToolkit" version="1.14.0" />
        <package id="linqtotwitter" version="2.1.06" />
    </packages>
</WizardData>

У кого-нибудь есть решение?

Ответы

Ответ 1

Ну, я столкнулся с той же проблемой и был разочарован тем, что не нашел ответа на этот пост. Теперь у меня есть ответ, и я отправляю его.

Не может быть двух расширений мастера. Поэтому вам нужно создать экземпляр NuGet из вашего настраиваемого мастера (см. Ниже) и делегировать все методы этому экземпляру.

Добавьте эти строки в метод RunStarted:

Assembly asm = Assembly.Load("NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a");
wizard = (IWizard)asm.CreateInstance("NuGet.VisualStudio.TemplateWizard");

И вызовите метод в экземпляре следующим образом:

wizard.RunStarted(automationObject, replacementsDictionary, runKind, customParams);

Аналогичным образом делегируйте экземпляр мастера во всех методах.

Ответ 2

Вместо того, чтобы ставить несколько ссылок в один элемент WizardExtension, вы можете добавить несколько элементов WizardExtension (по одному для каждой ссылки на сборку).

Например:

<WizardExtension>
  <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
  <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
</WizardExtension>

<WizardExtension>
  <Assembly>PartyTemplateWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=7eb2f41084fd4cd5</Assembly>
  <FullClassName>PartyTemplateWizard.Wizard</FullClassName>
</WizardExtension>

<WizardData>
  <packages repository="extension" repositoryId="your-extension-id-here">
    <package id="MvvmLight" version="4.1.27.0" />
    <package id="MvvmLightLibs" version="4.1.27.0" />
    <package id="MyToolkit" version="1.14.0" />
    <package id="linqtotwitter" version="2.1.06" />
  </packages>
</WizardData>

Используемые ссылки:

Отказ от ответственности: Я тестировал это только на Visual Studio-2015; а не Visual-Studio-2012 (хотя быстрый просмотр ответов на эту ссылку кажется, указывает, что он поддерживается и на VS2012)