Compartilhar via


Criar modelos de multiprojeto

Modelos de vários projetos atuam como contêineres para dois ou mais projetos do Visual Studio. Quando você cria um projeto baseado em um modelo multiprojetos, todos os projetos no modelo são adicionados à solução.

Observação

Os modelos discutidos neste artigo são os usados quando você cria projetos no Visual Studio, não os que dotnet new criam.

Um modelo multiprojeto tem dois ou mais modelos de projeto e um modelo raiz do tipo ProjectGroup.

Os modelos multiprojetos comportam-se de forma diferente dos modelos de projeto único. Eles têm as seguintes características exclusivas:

  • Nomes não podem ser atribuídos a projetos individuais em um modelo multiprojetos quando o modelo é usado para criar um projeto. Em vez disso, use o atributo ProjectName no elemento ProjectTemplateLink do arquivo vstemplate para especificar um nome para cada projeto.

  • Os modelos multiprojetos podem conter projetos de diferentes linguagens, mas o modelo inteiro em si só pode ser colocado em uma única categoria. Especifique a categoria de modelo no elemento ProjectType do arquivo vstemplate.

Um modelo multiprojeto deve incluir os itens a seguir, compactados em um arquivo .zip:

  • Um arquivo vstemplate raiz para todo o modelo multiprojeto. Esse arquivo vstemplate raiz contém metadados que são exibidos na caixa de diálogo em que você cria um projeto. Ela também especifica onde encontrar os arquivos vstemplate para os projetos no modelo. Esse arquivo deve estar localizado na raiz do arquivo .zip.

  • Duas ou mais pastas que contêm os arquivos necessários para um modelo de projeto concluído. As pastas incluem todos os arquivos de código do projeto e também um arquivo vstemplate do projeto.

Por exemplo, um arquivo .zip de modelo multiprojeto com dois projetos poderia ter os seguintes arquivos e diretórios:

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

O arquivo vstemplate raiz para um modelo multiprojeto difere de um modelo de projeto único das seguintes maneiras:

  • O atributo Type do elemento VSTemplate tem o valor ProjectGroup, em vez de Project. Por exemplo:

    <VSTemplate Version="2.0.0" Type="ProjectGroup"
        xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    
  • O elemento TemplateContent contém um elemento ProjectCollection que tem um ou mais elementos ProjectTemplateLink que definem os caminhos para os arquivos vstemplate dos projetos incluídos. Por exemplo:

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

Dica

Se você deseja que o modelo de multiprojetos apareça apenas na nova caixa de diálogo do projeto e não nos projetos individuais que ele contém, marque os modelos internos como oculto. Por exemplo:

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

Criar um modelo multiprojetos usando uma solução existente

  1. Crie uma solução e adicione dois ou mais projetos.

  2. Personalize os projetos até que eles estejam prontos para serem exportados para um modelo.

    Dica

    Se você estiver usando parâmetros de modelo e quiser se referir a variáveis do modelo pai, prefixe o nome do parâmetro com ext_. Por exemplo, $ext_safeprojectname$. Além disso, defina o atributo CopyParameters do elemento ProjectTemplateLink como true.

    <ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
    
  3. No menu Projeto, escolha Exportar Modelo.

    O Assistente para Exportar Modelo é aberto.

  4. Na página Escolher Tipo de Modelo, selecione Modelo de Projeto. Selecione um dos projetos que você deseja exportar para um modelo e, em seguida, escolha Avançar. (Você repetirá essas etapas para cada projeto na solução.)

  5. Na página Selecionar Opções do Modelo, insira um nome e uma descrição opcional, um ícone e uma imagem de exibição para o modelo. Escolha Concluir.

    O projeto é exportado para um arquivo .zip e colocado no local de saída especificado.

    Observação

    Cada projeto deve ser exportado para um modelo separadamente, portanto, repita as etapas anteriores para cada projeto na solução.

  6. Crie um diretório para o modelo, com um subdiretório para cada projeto.

  7. Extraia o conteúdo do arquivo .zip de cada projeto para o subdiretório correspondente que você criou.

  8. No diretório base, crie um arquivo XML com uma extensão de arquivo .vstemplate. Esse arquivo contém os metadados do modelo multiprojetos. Consulte o exemplo a seguir para obter a estrutura do arquivo. Certifique-se de especificar o caminho relativo para o arquivo vstemplate de cada projeto.

  9. Selecione todos os arquivos no diretório base e, no menu de clique com o botão direito do mouse ou de contexto, escolha Enviar para>Pasta compactada (zipada).

    Esses arquivos e pastas estão compactados em um arquivo .zip.

  10. Copie o arquivo .zip no diretório do modelo de projeto do usuário. Por padrão, esse diretório é %USERPROFILE%\Documents\Visual Studio <versão>\Templates\ProjectTemplates.

  11. No Visual Studio, abra a caixa de diálogo Arquivo>Novo>Projeto e verifique se o modelo é exibido.

Exemplo de dois projetos

Esse exemplo mostra um arquivo vstemplate raiz multiprojeto básico. Neste exemplo, o modelo tem dois projetos, Meu Aplicativo do Windows e Minha Biblioteca de Classes. O atributo ProjectName no elemento ProjectTemplateLink especifica o nome fornecido para o projeto.

Dica

Se o atributo ProjectName não for especificado, o nome do arquivo vstemplate será usado como o nome do projeto.

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

Exemplo com pastas de solução

Este exemplo usa o elemento SolutionFolder para dividir os projetos em dois grupos, Math Classes e Graphics Classes. O modelo tem quatro projetos, dois dos quais são colocados em cada pasta de solução.

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

Exemplo com referências de projetos

Este exemplo mostra como adicionar referências de projeto a um modelo de vários projetos e é essencialmente uma extensão do exemplo de modelo de vários projetos.

Neste exemplo, a solução tém dois projetos, MultiProject.Client e MultiProject.Shared. O projeto MultiProject.Client faz referência a MultiProject.Shared.

A estrutura da pasta é a seguinte:

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

Quando o modelo é usado, a parte MultiProject está sendo substituída pelo nome do projeto inserido pelo usuário.

MultiProjectTemplate.vstemplate tem a seguinte aparência. Observe que o ProjectTemplateLinks tem o atributo CopyParameters definido como true e que os atributos ProjectName usam a variável de modelo $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 pode ter a seguinte aparência. Observe que a tag Project tem o atributo ReplaceParameters definido como 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>

O MultiProject.Client\MultiProject.Client.csproj pode se parecer com o seguinte. Observe que o atributo Include do ProjectReference usa a variável de modelo $ext_safeprojectname$

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