Créer des modèles à projets multiples

Les modèles à plusieurs projets agissent en tant que conteneurs pour au moins deux projets Visual Studio. Quand vous créez un projet basé sur un modèle multiprojet, tous les projets inclus dans le modèle sont ajoutés à la solution.

Remarque

Les modèles évoqués dans cet article sont ceux utilisés lorsque vous créez des projets dans Visual Studio, et non ceux créés par dotnet new.

Un modèle à plusieurs projets contient deux modèles de projet ou plus, ainsi qu’un modèle racine de type ProjectGroup.

Les modèles à plusieurs projets se comportent différemment des modèles à projet unique. Leurs caractéristiques particulières sont les suivantes :

  • Vous ne pouvez pas affecter des noms de façon individuelle aux projets d’un modèle multiprojet quand le modèle est utilisé pour créer un projet. Pour spécifier un nom pour chaque projet, utilisez plutôt l’attribut ProjectName sur l’élément ProjectTemplateLink dans le fichier vstemplate.

  • Les modèles à plusieurs projets peuvent contenir des projets pour des langages différents, mais l’ensemble du modèle lui-même doit être placé dans une seule catégorie. Spécifiez la catégorie du modèle dans l’élément ProjectType du fichier vstemplate.

Un modèle à plusieurs projets doit inclure les éléments suivants, compressés dans un fichier .zip :

  • Un fichier vstemplate racine pour l’ensemble du modèle à plusieurs projets. Ce fichier vstemplate racine contient des métadonnées qui s’affichent dans la boîte de dialogue où vous créez un projet. Il spécifie également où trouver les fichiers vstemplate pour les projets du modèle. Ce fichier doit se trouver à la racine du fichier .zip.

  • Deux dossiers ou plus contenant les fichiers exigés pour un modèle de projet complet sont nécessaires. Les dossiers incluent tous les fichiers de code du projet, ainsi qu’un fichier vstemplate pour le projet.

Par exemple, le fichier .zip d’un modèle à plusieurs projets contenant deux projets peut comporter les fichiers et répertoires suivants :

  • MultiProjectTemplate.vstemplate
  • \Project1\MyTemplate.vstemplate
  • \Project1\Project1.vbproj
  • \Project1\Class.vb
  • \Project2\MyTemplate.vstemplate
  • \Project2\Project2.vbproj
  • \Project2\Class.vb

Le fichier vstemplate racine d’un modèle à plusieurs projets présente les différences suivantes par rapport à un modèle à projet unique :

  • L’attribut Type de l’élément VSTemplate a la valeur ProjectGroup au lieu de Project. Par exemple :

    <VSTemplate Version="2.0.0" Type="ProjectGroup"
        xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    
  • L’élément TemplateContent contient un élément ProjectCollection ayant un ou plusieurs éléments ProjectTemplateLink qui définissent les chemins des fichiers vstemplate des projets inclus. Par exemple :

    <TemplateContent>
        <ProjectCollection>
            <ProjectTemplateLink>
                Project1\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink>
                Project2\MyTemplate.vstemplate
            </ProjectTemplateLink>
        </ProjectCollection>
    </TemplateContent>
    

Conseil

Si vous souhaitez que seul le modèle à plusieurs projets s’affiche dans la boîte de dialogue du nouveau projet et pas les projets individuels qu’il contient, marquez les modèles internes comme masqués. Par exemple :

<VSTemplate Type="Project" ... >
    <TemplateData>
        ...
        <Hidden>true</Hidden>
    </TemplateData>
    ...
</VSTemplate>

Créer un modèle multiprojet à partir d’une solution existante

  1. Créez une solution et ajoutez deux projets ou plus.

  2. Personnalisez les projets jusqu’à ce qu’ils soient prêts à être exportés dans un modèle.

    Conseil

    Si vous utilisez des paramètres de modèle et que vous voulez référencer des variables du modèle parent, préfixez le nom du paramètre avec ext_. Par exemple : $ext_safeprojectname$. Par ailleurs, définissez l’attribut CopyParameters de l’élément ProjectTemplateLink sur true.

    <ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
    
  3. Dans le menu Projet, choisissez Exporter le modèle.

    L’Assistant Exportation de modèle s’ouvre.

  4. Dans la page Choisir un type de modèle, sélectionnez Modèle de projet. Sélectionnez un des projets que vous voulez exporter vers un modèle, puis choisissez Suivant. (Vous répétez ces étapes pour chaque projet de la solution.)

  5. Dans la page Sélectionner les options du modèle, entrez un nom et éventuellement une description, une icône et une image d’aperçu pour votre modèle. Cliquez sur Terminer.

    Le projet est exporté dans un fichier .zip et placé à l’emplacement de sortie spécifié.

    Notes

    Chaque projet doit être exporté séparément dans un modèle, donc répétez les étapes précédentes pour chaque projet dans la solution.

  6. Créez un répertoire pour votre modèle, avec un sous-répertoire pour chaque projet.

  7. Extrayez le contenu du fichier .zip de chaque projet dans le sous-répertoire correspondant que vous avez créé.

  8. Dans le répertoire de base, créez un fichier XML portant une extension .vstemplate. Ce fichier contient les métadonnées du modèle à plusieurs projets. Consultez l’exemple qui suit pour la structure du fichier. Veillez à spécifier le chemin relatif du fichier vstemplate de chaque projet.

  9. Sélectionnez tous les fichiers dans le répertoire de base, puis cliquez avec le bouton droit pour faire apparaître un menu contextuel et choisissez Envoyer vers>Dossier compressé.

    Les fichiers et dossiers sont compressés dans un fichier .zip.

  10. Copiez le fichier .zip dans le répertoire des modèles de projet utilisateur. Par défaut, ce répertoire est : %USERPROFILE%\Documents\Visual Studio <version>\Templates\ProjectTemplates.

  11. Dans Visual Studio, choisissez Fichier>Nouveau>Projet et vérifiez que votre modèle apparaît.

Exemple avec deux projets

Cet exemple montre un fichier vstemplate racine de base pour un modèle à plusieurs projets. Dans cet exemple, le modèle a deux projets, My Windows Application et My Class Library. L’attribut ProjectName de l’élément ProjectTemplateLink spécifie le nom donné au projet.

Conseil

Si l’attribut ProjectName n’est pas spécifié, le nom du fichier vstemplate est utilisé comme nom de projet.

<VSTemplate Version="2.0.0" Type="ProjectGroup"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    <TemplateData>
        <Name>Multi-Project Template Sample</Name>
        <Description>An example of a multi-project template</Description>
        <Icon>Icon.ico</Icon>
        <ProjectType>VisualBasic</ProjectType>
    </TemplateData>
    <TemplateContent>
        <ProjectCollection>
            <ProjectTemplateLink ProjectName="My Windows Application">
                WindowsApp\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="My Class Library">
                ClassLib\MyTemplate.vstemplate
            </ProjectTemplateLink>
        </ProjectCollection>
    </TemplateContent>
</VSTemplate>

Exemple avec des dossiers de solution

Cet exemple utilise l’élément SolutionFolder pour diviser les projets en deux groupes, Math Classes et Graphics Classes. Le modèle comporte quatre projets, dont deux sont placés dans chaque dossier solution.

<VSTemplate Version="2.0.0" Type="ProjectGroup"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    <TemplateData>
        <Name>Multi-Project Template Sample</Name>
        <Description>An example of a multi-project template</Description>
        <Icon>Icon.ico</Icon>
        <ProjectType>VisualBasic</ProjectType>
    </TemplateData>
    <TemplateContent>
        <ProjectCollection>
            <SolutionFolder Name="Math Classes">
                <ProjectTemplateLink ProjectName="MathClassLib1">
                    MathClassLib1\MyTemplate.vstemplate
                </ProjectTemplateLink>
                <ProjectTemplateLink ProjectName="MathClassLib2">
                    MathClassLib2\MyTemplate.vstemplate
                </ProjectTemplateLink>
            </SolutionFolder>
            <SolutionFolder Name="Graphics Classes">
                <ProjectTemplateLink ProjectName="GraphicsClassLib1">
                    GraphicsClassLib1\MyTemplate.vstemplate
                </ProjectTemplateLink>
                <ProjectTemplateLink ProjectName="GraphicsClassLib2">
                    GraphicsClassLib2\MyTemplate.vstemplate
                </ProjectTemplateLink>
            </SolutionFolder>
        </ProjectCollection>
    </TemplateContent>
</VSTemplate>

Exemple avec des références de projet

Cet exemple montre comment ajouter des références de projet à un modèle multi-projet et est essentiel à une extension de l’exemple de modèle multi-projet.

Dans cet exemple, la solution contient deux projets : MultiProject.Client et MultiProject.Shared. Le projet MultiProject.Client référence MultiProject.Shared.

La structure des dossiers est la suivante :

  • MultiProjectTemplate.vstemplate
  • \MultiProject.Client\MultiProject.Client.csproj
  • \MultiProject.Client\MyTemplate.vstemplate
  • \MultiProject.Shared\MultiProject.Shared.csproj
  • \MultiProject.Shared\MyTemplate.vstemplate

Lorsque le modèle est utilisé, la partie MultiProject est remplacée par le nom du projet que l’utilisateur entre.

MultiProjectTemplate.vstemplate ressemble à ce qui suit. Notez que les attributs ProjectTemplateLink ont l’attribut CopyParameters défini sur true et que les attributs ProjectName utilisent la variable de modèle $safeprojectname$.

<VSTemplate Version="2.0.0" Type="ProjectGroup"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
...
<TemplateContent>
    <ProjectCollection>
        <ProjectTemplateLink ProjectName="$safeprojectname$.Client" CopyParameters="true">
            MultiProject.Client\MyTemplate.vstemplate
        </ProjectTemplateLink>
        <ProjectTemplateLink ProjectName="$safeprojectname$.Shared" CopyParameters="true">
            MultiProject.Shared\MyTemplate.vstemplate
        </ProjectTemplateLink>
    </ProjectCollection>
</TemplateContent>
</VSTemplate>

MultiProject.Client\MyTemplate.vstemplate peut ressembler à ce qui suit. Notez que la balise Project a l’attribut ReplaceParameters défini sur true.

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
	...
	<TemplateContent>
		<Project TargetFileName="MultiProject.Client.csproj" File="MultiProject.Client.csproj" ReplaceParameters="true">
            ...
		</Project>
	</TemplateContent>
</VSTemplate>

MultiProject.Client\MultiProject.Client.csproj peut ressembler à ce qui suit. Notez que l’attribut Include de ProjectReference utilise la variable de modèle $ext_safeprojectname$

<Project>
    ...
	<ItemGroup>
	  <ProjectReference Include="..\$ext_safeprojectname$.Shared\$ext_safeprojectname$.Shared.csproj" />
	</ItemGroup>
</Project>