2013-07-12 1 views
5

Я следовал этот пост о том, как построить VSIX проект, который будет добавить некоторые пользовательские типы проектов MVC:VSIX с шаблонами проектов и NuGet пакеты

http://www.asp.net/mvc/tutorials/mvc-4/custom-mvc-templates

Я также хочу, чтобы включить некоторые дополнительные пакеты NuGet , поэтому я следил за this page from Nuget, но, похоже, для VS2010, и я работаю в 2012 году.

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

Однако, когда я отправляю установщика сотруднику, все ломается. Установщик работает, они видят новый тип проекта, но при создании проекта он получает сообщения об ошибках о невозможности установки каких-либо пакетов в узле расширения. Я подтвердил, что идентификатор продукта расширения является правильным (я намеренно исказил его в файле .vstemplate во время тестирования, и он дал совершенно другую ошибку). Я добавил пакеты в манифест расширения, но, похоже, это не имеет значения. Я также подтвердил, что файлы .nupkg развернуты в% ProgramFiles (x86)% \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Extensions.

Любые предложения о том, что делать? .vstemplate раздел

пользовательского проекта

<WizardExtension> 
    <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly> 
    <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName> 
</WizardExtension> 
<WizardData> 
    <packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true"> 
     <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" /> 
     <package id="jQuery" version="1.8.2" /> 
     <!-- snip --> 
    </packages> 
    <packages repository="extension" repositoryId="SampleExtensionId"> 
     <package id="Unity" version="3.0.1304.0" targetFramework="net45" /> 
     <package id="Unity.WebAPI" version="0.10" targetFramework="net45" /> 
     <!-- snip --> 
    </packages> 
</WizardData> 

source.extension.vsixmanifest теги активов

<Assets> 
    <Asset d:VsixSubPath="ProjectTemplates\CustomMVCTemplate" etc/> 
    <Asset Type="Unity.3.0.1304.0" Path="Packages\Unity.3.0.1304.0.nupkg" /> 
    <Asset Type="Unity.WebAPI.0.10" Path="Packages\Unity.WebAPI.0.10.nupkg" /> 
    <!-- snip --> 
</Assets> 

Структура файла

  • проекта Расширение
    • Пакеты
      • NugetPackage 1
      • NugetPackage 2
      • и т.д.
    • ProjectTemplates
      • CustomMVCTemplate
        • < файлы пользовательского проекта >
    • source.extension.vsixmanifest

ответ

1

Проверить эту ссылку http://samritchie.net/2012/09/17/nuget-packages-in-vs2012-templates/, который помог мне. Тем не менее, я все еще сталкиваюсь с проблемой, когда все пути моих ссылок пусты.

Примечание особенно следующий комментарий из статьи связаны выше:

Я провел значительный период времени попытки выработать то, что v2 эквивалент CustomExtension был, но вырезать длинную историю Короче говоря, вы не не нужно вносить какие-либо изменения в .vsixmanifest - достаточно включить все пакеты в VSIX в каталог «Пакеты».

+0

Отлично находкой. Я добавил ключевой пункт прямо в ваш ответ. – Olly

4

Я сделал шаг за шагом видео о том, как сделать VSIX, который автоматически загружает пакеты nuget.

http://www.youtube.com/watch?v=_ZvsFz41H-E

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

+0

Для всех, кто интересуется только соответствующей частью, он начинается в [22:47] (http://www.youtube.com/watch?feature=player_detailpage&v=_ZvsFz41H-E#t=1367) – KyleMit

+3

к сожалению он не загружает , Таким образом, пакеты просто добавляются в проект, если они уже загружены. – hakan

0

Чтобы скачать последние версии пакетов NuGet плюс все их зависимости добавить следующий класс в VSIX:

public class MyProjectWizard : IWizard 
{ 
    IEnumerable<string> _packages; 

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) 
    { 
     if (customParams.Length > 0) { 
      var vstemplate = XDocument.Load((string)customParams[0]); 
      _packages = vstemplate.Root 
       .ElementsNoNamespace("WizardData") 
       .ElementsNoNamespace("packages") 
       .ElementsNoNamespace("package") 
       .Select(e => e.Attribute("id").Value) 
       .ToList(); 
     } 
    } 

    public void ProjectFinishedGenerating(Project project) 
    { 
     var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel)); 
     var _installer = componentModel.GetService<IVsPackageInstaller2>(); 

     foreach (var package in _packages) { 
      _installer.InstallLatestPackage(null, project, package, false, false); 
     } 
    } 
} 

И затем использовать следующее vstemplate:

<WizardExtension> 
    <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=22c2a1a5fa7b6905</Assembly> 
    <FullClassName>MyProjectWizard.MyProjectWizard</FullClassName> 
    </WizardExtension>