Partager via


Packages dans les modèles Visual Studio

Les modèles de projet et d’élément Visual Studio doivent souvent s’assurer que certains packages sont installés lors de la création d’un projet ou d’un élément. Par exemple, le modèle ASP.NET MVC 3 installe jQuery, Modernr et d’autres packages.

Pour prendre en charge ce problème, les auteurs de modèles peuvent demander à NuGet d’installer les packages nécessaires, plutôt que des bibliothèques individuelles. Les développeurs peuvent ensuite facilement mettre à jour ces packages ultérieurement.

Pour en savoir plus sur la création de modèles eux-mêmes, reportez-vous à How to : Create Project Templates or Create Custom Project and Item Templates.

Le reste de cette section décrit les étapes spécifiques à suivre lors de la création d’un modèle pour inclure correctement les packages NuGet.

Samples

L’exemple Packages préinstallés est disponible dans le référentiel NuGet/Samples sur GitHub.

Ajout de packages à un modèle

Lorsqu’un modèle est instancié, un Assistant modèle est appelé pour charger la liste des packages à installer, ainsi que des informations sur l’emplacement de recherche de ces packages. Les packages peuvent être incorporés dans VSIX, incorporés dans le modèle ou situés sur le disque dur local auquel cas vous utilisez une clé de Registre pour référencer le chemin du fichier. Des détails sur ces emplacements sont donnés plus loin dans cette section.

Les paquets préinstallés fonctionnent à l’aide d'assistants de modèle. Un assistant spécial est appelé lorsque le modèle est instancié. L’Assistant charge la liste des packages qui doivent être installés et transmet ces informations aux API NuGet appropriées.

Étapes à suivre pour inclure des packages dans un modèle :

  1. Dans votre fichier vstemplate, ajoutez une référence à l’assistant de modèle NuGet en ajoutant l’élément 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 est un assembly qui contient uniquement le TemplateWizard classe, qui est un wrapper simple qui fait appel à l’implémentation réelle dans NuGet.VisualStudio.dll. La version de l’assembly ne changera jamais afin que les modèles de projet/élément continuent à fonctionner avec de nouvelles versions de NuGet.

  2. Ajoutez la liste des packages à installer dans le projet :

    <WizardData>
        <packages>
            <package id="jQuery" version="1.6.2" />
        </packages>
    </WizardData>
    

    L’Assistant prend en charge plusieurs <package> éléments pour des sources de package multiples. Les attributs id et version sont obligatoires, ce qui signifie que la version spécifique d’un paquet sera installée même si une version plus récente est disponible. Cela empêche les mises à jour de package de rompre le modèle, en laissant le choix de mettre à jour le package pour le développeur à l’aide du modèle.

  3. Spécifiez le référentiel dans lequel NuGet peut trouver les packages, comme décrit dans les sections suivantes.

Référentiel de packages VSIX

L’approche de déploiement recommandée pour les modèles de projet/élément Visual Studio est une extension VSIX , car elle vous permet de empaqueter plusieurs modèles de projet/élément ensemble et permet aux développeurs de découvrir facilement vos modèles à l’aide du Gestionnaire d’extensions VS ou de la galerie Visual Studio. Les mises à jour de l’extension sont également faciles à déployer à l’aide du mécanisme de mise à jour automatique de Visual Studio Extension Manager.

Le VSIX lui-même peut servir de source pour les packages requis par le modèle :

  1. Modifiez l’élément <packages> dans le .vstemplate fichier comme suit :

    <packages repository="extension" repositoryId="MyTemplateContainerExtensionId">
        <!-- ... -->
    </packages>
    

    L’attribut repository spécifie le type de référentiel comme extension, tandis que repositoryId est l’identifiant unique du VSIX (c'est la valeur de l’attribut ID dans le fichier de l’extension vsixmanifest, consultez la référence VSIX Extension Schema 2.0).

  2. Placez vos nupkg fichiers dans un dossier appelé Packages dans VSIX.

  3. Ajoutez les fichiers de package nécessaires comme <Asset> dans votre vsixmanifest fichier (voir Référence de l’extension VSIX 2.0) :

    <Asset Type="Moq.4.0.10827.nupkg" d:Source="File" Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />
    
  4. Notez que vous pouvez fournir des packages dans le même VSIX que vos modèles de projet ou les placer dans un VSIX distinct si cela est plus judicieux pour votre scénario. Toutefois, ne référencez aucun VSIX sur lequel vous n’avez pas de contrôle, car les modifications apportées à cette extension peuvent interrompre votre modèle.

Dépôt de modèle de paquet

Si vous distribuez un seul modèle de projet/élément et que vous n’avez pas besoin de empaqueter plusieurs modèles ensemble, vous pouvez utiliser une approche plus simple mais plus limitée qui inclut des packages directement dans le fichier ZIP du modèle de projet/élément :

  1. Modifiez l’élément <packages> dans le .vstemplate fichier comme suit :

    <packages repository="template">
        <!-- ... -->
    </packages>
    

    L’attribut repository a la valeur template et l’attribut repositoryId n’est pas obligatoire.

  2. Placez des packages dans le dossier racine du fichier ZIP du modèle de projet/élément.

Notez que l’utilisation de cette approche dans un VSIX qui contient plusieurs modèles entraîne un ballonnement inutile lorsqu’un ou plusieurs packages sont communs aux modèles. Dans ce cas, utilisez VSIX comme référentiel , comme décrit dans la section précédente.

Chemin d’accès au dossier spécifié par le Registre

Les kits SDK installés à l’aide d’une msi peuvent installer des packages NuGet directement sur l’ordinateur du développeur. Cela les rend immédiatement disponibles lorsqu’un modèle de projet ou d’élément est utilisé, plutôt que d’avoir à les extraire pendant cette période. ASP.NET modèles utilisent cette approche.

  1. Installez les paquets d'installation MSI sur l'ordinateur. Vous pouvez installer uniquement les fichiers .nupkg, ou les installer avec le contenu étendu, ce qui économise une étape supplémentaire lorsque le modèle est utilisé. Dans ce cas, suivez la structure de dossiers standard de NuGet où se trouvent les .nupkg fichiers dans le dossier racine, puis chaque package a un sous-dossier avec la paire ID/version comme nom du sous-dossier.

  2. Écrivez une clé de Registre pour identifier l’emplacement du package :

    • Emplacement clé : soit pour l'ensemble du système HKEY_LOCAL_MACHINE\SOFTWARE[\Wow6432Node]\NuGet\Repository, soit pour les modèles et paquets installés pour chaque utilisateur, utilisez alternativement HKEY_CURRENT_USER\SOFTWARE\NuGet\Repository
    • Nom de clé : utilisez un nom unique pour vous. Par exemple, les modèles ASP.NET MVC 4 pour VS 2012 utilisent AspNetMvc4VS11.
    • Valeurs : chemin d’accès complet au dossier packages.
  3. Dans l’élément <packages> du .vstemplate fichier, ajoutez l’attribut repository="registry" et spécifiez le nom de votre clé de Registre dans l’attribut keyName .

    • Si vous avez préalablement décompressé vos paquets, utilisez l’attribut isPreunzipped="true".

    • (NuGet 3.2+) Si vous souhaitez forcer une build au moment du design à la fin de l’installation du package, ajoutez l’attribut forceDesignTimeBuild="true" .

    • En guise d’optimisation, ajoutez skipAssemblyReferences="true" parce que le modèle lui-même inclut déjà les références nécessaires.

      <packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true">
          <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" />
          <-- ... -->
      </packages>
      

Meilleures pratiques

  1. Déclarez une dépendance sur NuGet VSIX en lui ajoutant une référence dans votre manifeste 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>
    <!-- ... -->
    
  2. Exiger que les modèles de projet/élément soient enregistrés lors de la création en incluant <PromptForSaveOnCreation>true</PromptForSaveOnCreation> dans le .vstemplate fichier.

  3. Les modèles n’incluent pas de packages.config fichier et n’incluent pas de références ou de contenu qui seraient ajoutés lorsque des packages NuGet sont installés.