Compartir vía


Crear plantillas de varios proyectos

Las plantillas de varios proyectos actúan como contenedores de dos o más proyectos de Visual Studio. Cuando se crea un proyecto basado en una plantilla de varios proyectos, todos los proyectos de la plantilla se agregan a la solución.

Nota:

Las plantillas que se describen en este artículo son las que se usan al crear proyectos en Visual Studio, no las que crea dotnet new.

Una plantilla de varios proyectos tiene como mínimo dos plantillas de proyectos y una plantilla raíz de tipo ProjectGroup.

Las plantillas de varios proyectos se comportan de forma distinta a las de proyecto único. Tienen las siguientes características únicas:

  • A los proyectos individuales de una plantilla de varios proyectos no se les puede asignar nombres cuando la plantilla se usa para crear un proyecto. En su lugar, use el atributo ProjectName del elemento ProjectTemplateLink que hay en el archivo vstemplate para especificar un nombre para cada proyecto.

  • Las plantillas de varios proyectos pueden contener proyectos para distintos lenguajes, pero la plantilla completa solo se puede colocar en una categoría. Especifique la categoría de plantilla en el elemento ProjectType del archivo vstemplate.

Una plantilla de varios proyectos debe incluir los elementos siguientes, comprimidos en un archivo .zip:

  • Un archivo raíz vstemplate para toda la plantilla de varios proyectos. Este archivo raíz vstemplate contiene metadatos que se muestran en el cuadro de diálogo en que se crea un proyecto. También especifica dónde encontrar los archivos vstemplate de los proyectos de la plantilla. Este archivo debe estar ubicado en la raíz del archivo .zip.

  • Dos o más carpetas que contienen los archivos necesarios para una plantilla de proyecto completa. Las carpetas incluyen todos los archivos de código del proyecto, así como un archivo vstemplate para el proyecto.

Por ejemplo, un archivo .zip de plantilla de varios proyectos que tiene dos proyectos podría tener los siguientes archivos y directorios:

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

El archivo raíz vstemplate de una plantilla de varios proyectos difiere de una plantilla de proyecto único de las siguientes formas:

  • El atributo Type del elemento VSTemplate tiene el valor ProjectGroup en vez de Project. Por ejemplo:

    <VSTemplate Version="2.0.0" Type="ProjectGroup"
        xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    
  • El elemento TemplateContent contiene un elemento ProjectCollection que tiene uno o varios elementos ProjectTemplateLink que definen las rutas de acceso a los archivos vstemplate de los proyectos incluidos. Por ejemplo:

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

Sugerencia

Si solo quiere que la plantilla de varios proyectos aparezca en el cuadro de diálogo del proyecto nuevo y no en los proyectos individuales que contiene, marque las plantillas internas como ocultas. Por ejemplo:

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

crear una plantilla de varios proyectos a partir de una solución existente

  1. Cree una solución y agregue como mínimo dos proyectos.

  2. Personalice los proyectos hasta que estén listos para exportarlos a una plantilla.

    Sugerencia

    Si usa parámetros de plantilla y quiere hacer referencia a variables de la plantilla principal, agregue el prefijo ext_ al nombre del parámetro. Por ejemplo: $ext_safeprojectname$. Además, establezca el atributo CopyParameters del elemento ProjectTemplateLink en true.

    <ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
    
  3. En el menú Proyecto, elija Exportar plantilla.

    Se abre el Asistente para exportar plantillas.

  4. En la página Elegir tipo de plantilla, seleccione Plantilla de proyecto. Seleccione uno de los proyectos que quiera exportar a una plantilla y, después, haga clic en Siguiente. (Repita estos pasos con todos los proyectos de la solución).

  5. En la página Seleccionar opciones de plantilla, escriba un nombre y, si quiere, una descripción, un icono y una imagen de vista previa para su plantilla. Elija Finalizar.

    El proyecto se exporta a un archivo .zip y se coloca en la ubicación de salida especificada.

    Nota:

    Cada proyecto debe exportarse a una plantilla de forma individual; por lo tanto, debe repetir los pasos anteriores para cada proyecto de la solución.

  6. Cree un directorio para la plantilla y un subdirectorio para cada proyecto.

  7. Extraiga el contenido de cada archivo .zip del proyecto en el subdirectorio correspondiente que acaba de crear.

  8. En el directorio base, cree un archivo XML que tenga le extensión de archivo .vstemplate. Ese archivo contiene los metadatos de la plantilla de varios proyectos. Vea el ejemplo que se indica a continuación para saber la estructura del archivo. Debe especificar la ruta de acceso relativa de cada archivo vstemplate del proyecto.

  9. Seleccione todos los archivos del directorio base y, en el menú contextual, elija Enviar a>Carpeta comprimida (en zip) .

    Los archivos y las carpetas se comprimen en un archivo .zip.

  10. Copie el archivo .zip en el directorio de plantillas de proyectos del usuario. De forma predeterminada, este directorio es %USERPROFILE%\Documentos\Visual Studio <versión>\Templates\ProjectTemplates.

  11. En Visual Studio, elija Archivo>Nuevo>Proyecto y compruebe que aparece su plantilla.

Ejemplo de dos proyectos

En este ejemplo, se muestra un archivo raíz vstemplate básico de varios proyectos. En este ejemplo, la plantilla tiene dos proyectos: Mi aplicación de Windows y Mi biblioteca de clases. El atributo ProjectName del elemento ProjectTemplateLink especifica el nombre que se da al proyecto.

Sugerencia

Si no se especifica el atributo ProjectName, el nombre del archivo vstemplate se usa como nombre del proyecto.

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

Ejemplo con carpetas de soluciones

En este ejemplo se usa el elemento SolutionFolder para dividir los proyectos en dos grupos: Clases matemáticas y Clases gráficas. La plantilla tiene cuatro proyectos, dos de los cuales se colocan en cada carpeta de soluciones.

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

Ejemplo con referencias de proyecto

En este ejemplo se muestra cómo agregar referencias de proyecto a una plantilla de varios proyectos y es básicamente una extensión del ejemplo de plantilla de varios proyectos.

En este ejemplo, la solución contiene dos proyectos, MultiProject.Client y MultiProject.Shared. El proyecto MultiProject.Client hace referencia a MultiProject.Shared.

La estructura de carpetas es la siguiente:

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

Cuando se usa la plantilla, se reemplaza el elemento MultiProject por el nombre del proyecto que escribe el usuario.

MultiProjectTemplate.vstemplate tiene el siguiente aspecto. Tenga en cuenta que los ProjectTemplateLinks tienen el atributo CopyParameters establecido en true y que los atributos ProjectName utilizan la variable de plantilla $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 podría tener un aspecto similar al siguiente. Tenga en cuenta que la etiqueta Project tiene el atributo ReplaceParameters establecido en 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 podría tener un aspecto similar al siguiente. Tenga en cuenta que el atributo Include de ProjectReference utiliza la variable de plantilla $ext_safeprojectname$

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