5 votes

VSIX avec les modèles de projet et les paquets NuGet

J'ai suivi ce post sur la façon de construire un projet VSIX qui ajoutera des types de projets MVC personnalisés :

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

Je veux également inclure quelques paquets Nuget supplémentaires, et je suivais donc les instructions suivantes cette page de Nuget mais il semble que ce soit pour VS2010 et je travaille en 2012.

J'ai construit le projet, et tout fonctionne bien sur ma machine. L'installation fonctionne, le nouveau type de projet apparaît, et lorsque je crée un nouveau projet de ce type, tout fonctionne parfaitement.

Cependant, lorsque j'envoie l'installateur à un collègue, les choses se cassent. Le programme d'installation fonctionne, le nouveau type de projet apparaît, mais lors de la création du projet, il reçoit des messages d'erreur indiquant qu'il ne peut installer aucun des paquets du nœud d'extension. J'ai confirmé que l'identifiant de produit de l'extension est correct (j'ai intentionnellement malformé l'identifiant dans le fichier .vstemplate pendant le test et cela a donné une erreur totalement différente). J'ai ajouté les paquets au manifeste de l'extension, mais cela ne semble pas faire de différence. J'ai également confirmé que les fichiers .nupkg sont déployés dans %ProgramFiles(x86)%. \Microsoft Visual Studio 11.0 \Common7\IDE\Extensions.

Des suggestions sur ce qu'il faut faire ?

Section .vstemplate du projet personnalisé

<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 Balises d'actifs

<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>

Structure du fichier

  • Projet d'extension
    • Packages
      • Paquet Nuget 1
      • Paquet Nuget 2
      • etc.
    • Modèles de projet
      • Modèle de CVC personnalisé
        • <fichiers de projet personnalisés>
    • source.extension.vsixmanifest

5voto

Min Points 366

J'ai fait une vidéo étape par étape sur la façon de créer un VSIX qui télécharge automatiquement les paquets nuget.

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

Comme il y a beaucoup d'étapes et que je ne les ai jamais notées, je ne vais pas les taper ici. J'ai testé mon paquet VSIX sur la machine d'autres personnes et cela a fonctionné, alors j'espère que cela fonctionnera pour vous.

3voto

Poma Points 2020

Pour télécharger les dernières versions des paquets NuGet et toutes leurs dépendances, ajoutez la classe suivante à votre 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);
        }
    }
}

Et ensuite utiliser ce qui suit dans vstemplate :

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

1voto

user2624591 Points 11

Consultez ce lien http://samritchie.net/2012/09/17/nuget-packages-in-vs2012-templates/ ce qui m'a aidé. Cependant, je rencontre toujours le problème suivant : les chemins de toutes mes références sont vides.

Notez en particulier le commentaire suivant de l'article lié ci-dessus :

J'ai passé un temps considérable à essayer de comprendre ce qu'était l'équivalent v2 de CustomExtension, mais pour faire court, vous n'avez pas besoin de modifier le .vsixmanifest - il suffit d'inclure tous les paquets dans le VSIX dans un répertoire 'Packages'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X