Pacotes em modelos do Visual Studio
Os modelos de projeto e item do Visual Studio geralmente precisam garantir que determinados pacotes sejam instalados quando o projeto ou item for criado. Por exemplo, o modelo do ASP.NET MVC 3 instala jQuery, Modernizr e outros pacotes.
Para dar suporte a isso, os autores de modelo podem instruir o NuGet a instalar os pacotes necessários, em vez de bibliotecas individuais. Os desenvolvedores podem atualizar facilmente esses pacotes posteriormente a qualquer momento.
Para saber mais sobre como criar modelos, consulte Como fazer para criando modelos de projeto ou Criando modelos personalizados de projeto e de item.
O restante desta seção descreve as etapas específicas a serem tomadas ao criar um modelo para incluir corretamente os pacotes do NuGet.
Exemplos
A amostra de pacotes pré-instalados está disponível no repositório NuGet/de amostras no GitHub.
Adicionar pacotes a um modelo
Quando um modelo é instanciado, um Assistente de modelo é invocado para carregar a lista de pacotes para instalar juntamente com informações sobre onde encontrar esses pacotes. Pacotes podem ser inseridos no VSIX, inseridos no modelo ou localizados no disco rígido local, quando então você usa uma chave do Registro para referenciar o caminho do arquivo. Detalhes sobre esses locais são fornecidos mais adiante nesta seção.
Pacotes pré-instalados funcionam usando assistentes de modelo. Um assistente especial é invocado quando o modelo é instanciado. O assistente carrega a lista de pacotes que precisam ser instalados e transmite essas informações para as APIs do NuGet apropriadas.
Etapas para incluir pacotes em um modelo:
No seu arquivo
vstemplate
, adicione uma referência ao assistente de modelo do NuGet adicionando um elementoWizardExtension
:<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
é um assembly que contém apenas a classeTemplateWizard
, que é um wrapper simples que chama a implementação real emNuGet.VisualStudio.dll
. A versão do assembly nunca será alterada para que os modelos de projeto/item continuem a funcionar com novas versões do NuGet.Adicione a lista de pacotes a serem instalados no projeto:
<WizardData> <packages> <package id="jQuery" version="1.6.2" /> </packages> </WizardData>
O assistente é compatível com vários elementos
<package>
para dar suporte a várias origens de pacote. Ambos os atributosid
eversion
são necessários, o que significa que a versão específica de um pacote será instalada mesmo se uma versão mais recente estiver disponível. Isso impede que atualizações do pacote interrompam o modelo, deixando a opção de atualizar o pacote para o desenvolvedor que usa o modelo.Especifique o repositório em que o NuGet pode encontrar os pacotes conforme descrito nas seções a seguir.
Repositório de pacote VSIX
A abordagem de implantação recomendada para modelos de projeto/item do Visual Studio é um extensão do VSIX porque ela permite empacotar vários modelos de projeto/item juntos e permite que os desenvolvedores descubram facilmente seus modelos usando o Gerenciador de Extensões do VS ou a Galeria do Visual Studio. Atualizações da extensão também são fáceis de implantar usando o mecanismo de atualização automática do Gerenciador de Extensões do Visual Studio.
O próprio VSIX pode servir como a origem para os pacotes necessários para o modelo:
Modifique o elemento
<packages>
no arquivo.vstemplate
da seguinte maneira:<packages repository="extension" repositoryId="MyTemplateContainerExtensionId"> <!-- ... --> </packages>
O atributo
repository
especifica o tipo de repositório comoextension
enquantorepositoryId
é o identificador exclusivo do VSIX (esse é o valor do atributoID
no arquivovsixmanifest
da extensão, consulte Referência do Esquema de Extensão do VSIX 2.0).Coloque seus arquivos
nupkg
em uma pasta chamadaPackages
dentro do VSIX.Adicione os arquivos de pacote necessários como
<Asset>
no seu arquivovsixmanifest
(consulte Referência do Esquema de Extensão do VSIX 2.0):<Asset Type="Moq.4.0.10827.nupkg" d:Source="File" Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />
Observe que você pode entregar os mesmos pacotes VSIX como seus modelos de projeto ou colocá-los em um VSIX separado se isso fizer mais sentido para o seu cenário. No entanto, não faça referência a nenhum VSIX que você não controla, pois as alterações para esta extensão podem interromper o modelo.
Repositório de pacote de modelo
Se você estiver distribuindo apenas um modelo de projeto/item único e não precisar empacotar vários modelos, será possível usar uma abordagem mais simples, mas mais limitada, que inclui pacotes diretamente no arquivo ZIP do modelo do projeto/item:
Modifique o elemento
<packages>
no arquivo.vstemplate
da seguinte maneira:<packages repository="template"> <!-- ... --> </packages>
O atributo
repository
tem o valortemplate
e o atributorepositoryId
não é necessário.Coloque os pacotes na pasta raiz do arquivo ZIP do modelo de projeto/item.
Observe que usar, usando essa abordagem, um VSIX que contém vários modelos leva a sobrecarga desnecessária quando um ou mais pacotes são comuns aos modelos. Nesses casos, use o VSIX como repositório conforme descrito na seção anterior.
Caminho da pasta especificada do Registro
SDKs que são instalados usando um MSI podem instalar os pacotes do NuGet diretamente no computador do desenvolvedor. Isso faz com que eles fiquem disponíveis imediatamente quando um modelo de projeto ou item é usado, em vez de precisar extrai-los durante esse período. Modelos ASP.NET usam essa abordagem.
Faça o MSI instalar pacotes no computador. Você pode instalar apenas os arquivos
.nupkg
ou instalá-los junto com o conteúdo expandido, que salva uma etapa adicional quando o modelo é usado. Nesse caso, siga a estrutura de pasta padrão do NuGet no qual os arquivos.nupkg
estão na pasta raiz e cada pacote tem uma subpasta com o par de ID/versão como o nome da subpasta.Grave uma chave do Registro para identificar o local do pacote:
- Local da chave: o
HKEY_LOCAL_MACHINE\SOFTWARE[\Wow6432Node]\NuGet\Repository
em todo o computador ou, em caso de modelos e pacotes instalados por usuário, useHKEY_CURRENT_USER\SOFTWARE\NuGet\Repository
como alternativa - Nome da chave: use um nome exclusivo para você. Por exemplo, os modelos do ASP.NET MVC 4 para VS 2012 usam
AspNetMvc4VS11
. - Valores: o caminho completo para a pasta de pacotes.
- Local da chave: o
No elemento
<packages>
no arquivo.vstemplate
, adicione o atributorepository="registry"
e especifique o nome da chave do Registro no atributokeyName
.Se você já descompactou seus pacotes, use o atributo
isPreunzipped="true"
.(NuGet 3.2 e superior) Se você quiser forçar um build de tempo de design no final da instalação do pacote, adicione o atributo
forceDesignTimeBuild="true"
.Como uma otimização, adicione
skipAssemblyReferences="true"
porque o próprio modelo já inclui as referências necessárias.<packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true"> <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" /> <-- ... --> </packages>
Práticas Recomendadas
Declare uma dependência no VSIX NuGet adicionando uma referência a ele no seu manifesto do 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> <!-- ... -->
Exija que modelos de item/projeto sejam salvos na criação incluindo
<PromptForSaveOnCreation>true</PromptForSaveOnCreation>
no arquivo.vstemplate
.Os modelos não incluem um arquivo
packages.config
, nem incluem nenhuma referência ou conteúdo que seria adicionada na instalação dos pacotes NuGet.