Certificação Microsoft 70-487: Objetivo 5.4 – Manage packages by using NuGet

Olá pessoal!
O objetivo 5.4, Manage packages by using NuGet, cobre todos os aspectos do NuGet: como instalar e atualizar um pacote, criar e configurar um pacote e preparar um repositório de pacotes. Vamos lá?

Instalando E Atualizando Um Pacote NuGet Existente

O NuGet permite que você instale bibliotecas para usar no seu código. Caso veja no exame alguma coisa sobre referenciar bibliotecas populares, pense em NuGet. Um pacote NuGet, além de ter uma série de assemblies que você pode referenciar, pode conter arquivos, como JavaScripts e CSSs. Também podem alterar seu arquivo de configuração ou adicionar código no seu projeto. A grande vantagem é que, ao invés de você ter que manualmente baixar assemblies ou arquivos, o NuGet faz isso automaticamente para você.

A partir do Visual Studio 2012, os templates de projetos são baseados no NuGet. Se você criar uma aplicação ASP.NET MVC com o template de Internet, por exemplo, um arquivo chamado packages.config é criado contendo todas as referências ao pacotes utilizados. Esse arquivo é parecido com isso:

Janela Manage NuGet Packages

A janela Manage NuGet Packages serve para você gerenciar os pacotes instalados no seu projeto e instalar novos pacotes.

Você pode acessá-la pelo Visual Studio no menu Tools > Library Package Manager > Manage NuGet Packages. Desse modo, os pacotes da solution inteira são abertos:

manage nuget packages

Indo na seção Online, você pode procurar os pacotes disponíveis e instalá-los diretamente do Visual Studio. Na parte Update, o Visual Studio detecta todas as atualizações disponíveis e você pode instalá-las com 1 clique.

Você pode abrir os pacotes instalados apenas para 1 projeto, clicando com o botão direito em References > Manage NuGet Packages. A tela funciona exatamente igual.

Outra grande vantagem do NuGet é que, ao instalar ou atualizar um pacote, ele detecta automaticamente todas as dependências e as instala juntamente com o pacote.

Package Manager Console

Para instalar, atualizar ou remover pacotes, você pode também usar o Package Manager Console, que é um Windows PowerShell integrado ao Visual Studio. Ele é assim:

package manager console

Para instalar um pacote, o comando Install-Package pode ser usado. Exemplo: Install-Package Ninject.

Com isso, o assembly do Ninject é baixado para a pasta packages da solution e uma referência é adicionada ao projeto.

Uma feature interessante do console é o auto complete, acionado quando você aperta a tecla Tab. Ele funciona para os nomes dos comandos e dos pacotes.

Para desinstalar um pacote, o comando é o Uninstall-Package: Uninstall-Package Ninject.

Esse comando remove o pacote do packages.config, remove a referência do projeto e deleta a pasta da packages. Todas as alterações aos arquivos de configuração também são revertidas. Porém, as dependências instaladas não são automaticamente removidas.

Para atualizar um pacote, o comando é Update-Package: Update-Package Ninject.

Caso você não especifique um pacote para o comando Update-Package, todos os pacotes da solution são atualizados. Para atualizar todos os pacotes de apenas um projeto, o parâmetro -Project pode ser usado: Update-Package -Project NuGetTest.

Alguns pacotes oferecem comandos que são integrados ao console. Após instalar o pacote do Entity Framework, por exemplo, você pode usar os comandos Enable-Migrations, Add-Migration e Update-Database para usar Code First Migrations.

O último detalhe é que os comandos são executados por padrão para o primeiro projeto da solution. Isso pode ser alterado no drop-down Default project.

Compartilhando Pacotes

Incluir os pacotes no controle de versão não é uma boa prática, pois todos eles serão guardados e baixados para cada pessoa que acessar o projeto. Se você esquecer de adicionar um pacote no controle de versão, também vai haver problemas para os outros usuários.

Ao clicar com o botão direito na solution no Visual Studio, você pode habilitar a opção Enable Package Restore On Build. Ao fazer isso, uma pasta .nuget é adicionada na solution com um arquivo NuGet.exe. Dessa forma, no build do projeto o NuGet vai validar se todos os pacotes estão instalados e, se algum estiver faltando, vai fazer o download automaticamente. Isso permite que você não precise colocar os pacotes no controle de versão.

Se você quer mudar a localização dos pacotes instalados, basta adicionar um arquivo nuget.config na solution com o seguinte conteúdo:

Criando E Configurando Um Pacote NuGet

Qualquer pessoa pode adicionar um pacote NuGet na galeria, tornando-o disponível a todos. Essa seção explica como criar e configurar um pacote para disponibilizá-lo na galeria.

Conteúdo Do Pacote

Um pacote NuGet é descrito pelo arquivo .nuspec, contendo um XML que descreve seu pacote. Ele é mais ou menos assim:

Em seguida, você vai colocar seus arquivos. A convenção é distribuí-los em 3 pastas: \lib, \content e \tools.

A pasta lib contém os assemblies. Se seu pacote for multiplataforma, você pode usar subpastas para separar essas versões.

A pasta content tem arquivos de configuração, imagens, JavaScript, CSS, etc. Todos os arquivos nessa pasta serão incluídos no projeto. Isso significa que se você tiver uma imagem em \content\images\myimg.png, ela será adicionada no projeto em \images\myimg.png.
Arquivos de transformação também podem ser colocados nessa pasta. Se houver um arquivo app.config.transformation ou web.config.transformation, o NuGet vai colocar os elementos desses arquivos que não estiverem no arquivo de configuração do projeto.
Isso também é possível via código com arquivos .cs.pp quando você quer adicionar código no Global.asax ou alguma classe, por exemplo. Há alguns tokens que podem ser usados, como o $rootnamespace$, que insere o namespace correto: namespace $rootnamespace$.Models.

Por fim, na pasta tools podem ser colocados scripts Windows PowerShell para rodar quando seu pacote é carregado, instalado e desinstalado, com os nomes Init.ps1, Install.ps1 e Uninstall.ps1, respectivamente.

Um último detalhe é que se seu pacote não tiver nada dentro das pastas content e lib ele é considerado um pacote a nível de solution. Você usa isso se seu objetivo for adicionar comandos ao Package Manager Console, como o pacote do Entity Framework.

Criando Seu Pacote NuGet

Você pode criar seu pacote NuGet via linha de comando ou usando a ferramenta NuGet Package Explorer.

Para usar a linha de comando, você deve ter o arquivo NuGet.exe e adicionar a localização dele no PATH.

O primeiro comando que você deve utilizar é o NuGet Update -self, que atualiza o NuGet para a última versão.

Para criar um pacote NuGet a partir de um assembly, o comando é o nuget spec MyAssembly.dll. Com isso o arquivo MyAssembly.nuspec é criado contendo o manifesto para você editar o nome, descrição, dependências, etc.

Depois disso, o comando nuget pack MyAssembly.nuspec cria de fato seu pacote no arquivo MyAssembly.dll.1.0.0.nupkg. Você pode testá-lo no Visual Studio abrindo o Package Manager Console e digitando o comando Install-Package MyAssembly.dll -Source "C:\{location_of_your_package}".

Você pode também criar um pacote NuGet a partir de um projeto do Visual Studio. Basta ir para a pasta do projeto (onde está o arquivo .csproj) e rodar o comando nuget spec. O arquivo .nuspec vai ser criado obtendo os tokens de id, versão, autor e descrição do arquivo AssemblyInfo.cs do projeto. Depois o comando nuget pack MyProject.csproj cria o pacote completo.

Para criar um pacote complexo que contenha as pastas lib, content e tools, você precisa criar seu pacote manualmente com o comando nuget spec, editar o arquivo .nuspec como desejado, adicionar os arquivos nas pastas e criar o pacote com nuget pack YourPackage.nuspec.

Com seu pacote pronto, você vai publicá-lo no NuGet. Com a API Key gerada no site do NuGet, você deve primeiro rodar o comando NuGet SetApiKey Your-API-Key. Depois, a publicação é feita com NuGet Push YourPackage.nupkg.

A outra opção para criar e publicar um pacote é usando o programa NuGet Package Explorer. Essa ferramenta permite que você crie o manifesto com um editor gráfico, adicione arquivos nas pastas lib, content e tools e publique o pacote para o NuGet com 1 clique. Você pode também abrir pacotes, tanto locais quanto do feed, para explorar o conteúdo.

Preparando Um Repositório De Pacotes

Por padrão, o Visual Studio configura o repositório oficial do NuGet para obter pacotes. Você pode adicionar repositórios adicionais, tanto locais quanto remotos.

Para criar um repositório local, você vai em Tools > Library Package Manager > Package Manager Settings. Na aba Package Source, a seguinte tela é mostrada:

options

Depois é só clicar o botão Add, colocar um nome e um caminho. Todos os arquivos .nupkg serão listados na aba Online da janela Manage NuGet Packages e no Package Manager Console, no drop-down Package-source.

Você pode também criar um feed remoto que roda no IIS. Você deve criar uma web application vazia no Visual Studio e instalar o pacote NuGet.Server. Esse pacote adiciona todo o código necessário para a exposição dos seus pacotes como ATOM. Os pacotes dentro da pasta Packages serão disponibilizados (podendo ser configurado via web.config).

É possível habilitar publicações para seu repositório remoto, como se fosse a galeria oficial do NuGet. Para isso basta adicionar a API Key no web.config.

Depois, basta hospedar sua aplicação no IIS e acessar o feed na URL http://{locationofyoursite}/nuget/. Adicionando essa URL no Package Source, é possível instalar pacotes desse repositório normalmente.


E isso é tudo :)

Obrigado pela leitura e aguarde o próximo post, que será sobre o objetivo Create, configure, and publish a web package.

Até mais!