Tutorial: Criando um Pacote NuGet e Publicando no Azure DevOps

Neste tutorial você vai aprender uma das técnicas para criar um Pacote NuGet para projeto library C#, publicá-lo no repositório do Azure DevOps, e por fim consumir esse pacote através de um outro projeto .NET.

Tutorial: Criando um Pacote NuGet e Publicando no Azure DevOps

O tutorial foi dividido em 6 tópicos principais. Se preferir pode pular um tópico ou outro. Antes de tudo, demonstro todo o padrão de texto, tópicos e passo a passo do tutorial para que você não se perca na leitura. Todas as informações importantes presentes neste artigo, serão destacadas com o título Pulo do Gato.

A partir desse ponto, a leitura do tutorial é de 5 minutos, e sua aplicação 15 minutos.


#1 – Overview do tutorial

  • O tutorial será explicado em # Passo 01, # Passo 02… e assim por diante.
  • Em cada Passo, as ações Acesse, Abra, Configure e outras, estarão sempre no início do texto e em negrito.
  • Palavras-chave nos textos terão links a artigos deste Blog ou outros, sempre como referência.
  • A minha opinião/observação será feita sempre ao final de cada tópico.
  • O Pulo do Gato, estará sempre em negrito e bem destacado conforme exemplo abaixo:

Pulo do Gato: Você pode baixar todo o código fonte deste tutorial sem ler absolutamente nada. Para fazer isso basta acessar meu github.

DESIGN PATTERNS vol.1 - Programação no Mundo Real - Fabio Silva Lima


#2 – Pré-requisitos para o tutorial.

Se você não está familiarizado com o Azure DevOps, vou tentar explicar de forma que você não fique perdido. Para realizar o tutorial, você vai precisar:

  • Instalar Visual Studio 2017, em qualquer versão, até mesmo a Community, que é uma versão gratuita. Hoje em dia está fácil instalar essa IDE, diferente de quando instalei pela primeira vez no UNBOXING Visual Studio 2017: Primeiras impressões no Mundo Real.
  • Vincular seu e-mail a uma conta Microsoft. Se você possui conta em algum serviço Microsoft (Skype, MSN, Live, Office 365 entre outros), você não precisa mais fazer esse vínculo.
  • Ter uma conta no Azure DevOps. Por exemplo, a minha conta é fabiosilvalima.visualstudio.com. Se não tem, crie uma aqui, é gratuito.
  • Criar um projeto do tipo GIT no Azure DevOps. Se possível nomeá-lo como Tutorial 2 para se familiarizar com esse tutorial.

Eu apoio Fabio Silva Lima


#Glossário

Azure DevOps: Ferramenta da Microsoft focada para atender todos os requisitos do ciclo de vida do desenvolvimento de software, desde a gestão de tarefas usando metodologias ágeis, controle e versionamento de código fonte, como automação de procedimentos, testes e por fim publicação do software em ambiente online. Essa ferramenta já foi chamada de Visual Studio Online VSTS.

Build: No Azure DevOps, Build é mais que uma simples compilação de um projeto e sim uma série de tarefas que contemplam toda automação de compilação, testes e preparação para publicação do projeto.

GIT: Engine de versionamento de qualquer tipo de código fonte. O Azure DevOps também utiliza o engine do GIT se você configurá-lo. Não confunda GIT com GITHUB. GITHUB é um site que usa a engine do GIT. Mas OK, é do mesmo criador, o famoso Linus Torvalds, criador do kernel Linux.


#3 – Criando um projeto library DLL C#.

Se você não quiser realizar esse tópico, pode baixar o código fonte de apoio no meu github e pular diretamente para o tópico #4.

O que faremos?

Criar um projeto C# Library e preencher todas as informações do assembly para ela. Criar um arquivo XML com extensão .nuspec para configurar nome do pacote, versão, licença entre outras informações. Vamos fazer download do NuGet CLI, e gerar o pacote NuGet via command line a partir desse projeto C#. Na sequência iremos criar o pacote NuGet para publicá-lo no Azure DevOps.

# Passo 01: Abra o Visual Studio 2017, clique em File, New e Project. Preencha os campos com as seguintes informações:

  • Name: FSL.Framework.Core
  • Location: c:\inetpub\wwwroot\Tutorial2
  • Solution Name: FSL.Framework
  • Framework: 4.7.1

Pulo do Gato: Se usar o Windows 10, vai precisar abrir o VS 2017 como Administrador. Clique botão direito em cima do ícone e escolha Run as administrator.

Passo 02: Após preencher todas as informações, clique no botão OK para criar o projeto.

# Passo 02: Clique no botão OK para criar o projeto C#.

# Passo 03: Apague o arquivo Class1.cs que foi criado automaticamente pelo Visual Studio.

# Passo 04: Faça download do projeto C# Useful Extensions Methods no meu github, descompacte-o, copie todas as classes Extension e cole no projeto FSL.Framework.Core.

# Passo 05: Instale o pacote NuGet Newtonsoft JSON, pois essas Extensions que você copiou no Passo 04, dependem desse pacote JSON. Adicione também uma referência à lib System.Web do .NET Framework.

Passo 05: Instale o pacote NuGet Newtonsoft JSON, pois essas Extensions que você copiou do meu github, dependem desse pacote JSON. Adicione também a referência a lib System.Web do .NET Framework.

# Passo 06: Crie um arquivo XML com o nome FSL.Framework.Core.nuspec. Esse é o arquivo de configuração para o Pacote NuGet para o FSL.Framework.Core.csproj.

Passo 6: Crie um arquivo XML com o nome FSL.Framework.Core.nuspec. Esse é o arquivo de configuração para o Pacote NuGet para o FSL.Framework.Core.csproj.

Pulo do Gato: O arquivo de configuração do Pacote NuGet deve ter o mesmo nome do .csproj, mas com a extensão .nuspec, e deve estar localizado na mesma pasta do arquivo .csproj.

# Passo 07: Copie o conteúdo abaixo e cole no arquivo XML FSL.Framework.Core.nuspec.

<?xml version="1.0"?>
<package >
    <metadata>
        <id>FSL.Framework.Core</id>
        <version>1.0.0</version>
        <title>CORE do Framework FSL</title>
        <authors>Fabio Silva Lima</authors>
        <owners>Fabio Silva Lima</owners>
        <licenseUrl>https://www.fabiosilvalima.com</licenseUrl>
        <projectUrl>https://github.com/fabiosilvalima</projectUrl>
        <iconUrl>https://www.fabiosilvalima.com</iconUrl>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>CORE do Framework FSL Nuget Package</description>
        <releaseNotes>First Version</releaseNotes>
        <copyright>Fabio Silva Lima</copyright>
        <tags>C# Framework FSL</tags>
    </metadata>
</package>


#4 – Criando um Pacote NuGet para projeto library DLL C#.

Dentre todas as tags que estão no arquivo de configuração FSL.Framework.Core.nuspec, algumas delas são muito importantes:

  • id: ID do pacote, deve ser um nome único no repositório NuGet. Como iremos colocar no Azure DevOps, que ainda não existe, não teremos problema. Mas se fossemos colocar no NuGet.org, esse ID já poderia existir, então é um ponto de atenção.
  • version: É o número da versão do pacote no formato X.X.X.
  • title e description: Título e descrição do pacote, independente da versão.
  • releaseNotes: Descrição da versão correspondente, features, o que há de novo etc.
  • tags: Palavras-chave delimitadas por espaço com propósito para busca.

# Passo 01: Faça download do último NuGet CLI e copie o arquivo nuget.exe para uma pasta C:\NuGet\.

# Passo 02: Clique em cima do arquivo FSL.Framework.Core.nuspec, no Visual Studio, e escolha a opção Open Command Prompt.

Pulo do gato: Para gerar Pacote NuGet é necessário que o .csproj esteja compilado em Release.

# Passo 03: Compile a solution em modo Release.

# Passo 04: Copie e Cole o comando abaixo no prompt de comando e pressione ENTER:

c:\NuGet\NuGet.exe pack FSL.Framework.Core.csproj  -prop Configuration=Release

Pronto! Pacote NuGet criado para o projeto FSL.Framework.Core. O pacote foi criado na mesma pasta com o nome FSL.Framework.Core.1.0.0.nupkg.

Pronto! Pacote NuGet criado para o projeto FSL.Framework.Core. O pacote foi criado na mesma pasta com o nome FSL.Framework.Core.1.0.0.nupkg.

Pulo do gato: Também funciona utilizar o arquivo .nuspec ao invés do .csproj via linha de comando, mas as dependências não virão automaticamente. Por exemplo, nosso projeto depende do Newtonsoft JSON. Se usar o .nuspec, essas dependências não estarão no pacote. Na verdade até existe um parâmetro a mais para incluir essas dependências (se você rodar da sua máquina), mas não funciona (até a criação deste artigo), se rodar dentro do Azure DevOps.


#Considerações até aqui

Você pode ter problema com um projeto existente caso você tenha movido-o de pasta, trocado o caminho de alguma referência, movido pasta packages, e/ou seu projeto tiver um nome muito grande. Alguns casos, se seu projeto possui Pacote NuGet de versões muito antigas, pode dar algum problema ou erro no command line.


#5 – Publicação do Pacote NuGet no Azure DevOps

O que faremos?

A partir de uma conta no Azure DevOps, instalaremos a Extension Azure Artifacts disponível no Azure DevOps Marketplace. Após instalação, criaremos um Feed NuGet Package chamado FabioSilvaLima. E finalmente, iremos rodar os comandos para publicar o pacote no Azure DevOps no Feed FabioSilvaLima.

# Passo 01: Abra o Azure DevOps, crie um novo projeto Tutorial 2. É nesse projeto onde usaremos como repositório do NuGet. Você poderá apagar esse projeto depois sem problemas.

# Passo 02: Clique no menu esquerdo Artifacts dentro projeto Tutorial 2. Vai aparecer uma tela onde é preciso ter uma licença de uso dessa funcionalidade.

Passo 2: Dentro projeto Tutorial 2, clique no menu esquerdo Artifacts. Vai aparecer uma tela onde é preciso ter uma licença de uso dessa funcionalidade.

# Passo 03: Clique no link para instalar a Extension Azure Artifacts na sua conta do Azure DevOps. Clique no botão verde GET, em seguida selecione a conta do Azure DevOps que você quer que a Extension seja instalada. Clique no botão azul Start 30 day free trial.

Fabio Silva Lima - Azure Artifacts

Fabio Silva Lima - Azure Artifacts

Fabio Silva Lima - Azure Artifacts

Pulo do gato: o Azure DevOps e Azure Artifacts é gratuito para até 5 usuários do tipo programadores ou administradores. Se você precisar pode pagar por mais usuários através da própria plataforma. Você também pode ter (ou participar) de quantas contas Azure DevOps quiser, por isso é necessário escolher em qual conta uma extension será instalada.

# Passo 04: Volte naquela página do Passo 02 e atualize a página F5. Agora vai aparecer um botão para criar um Feed (repositório NuGet).

Volte naquela página do Passo 02 e atualize a página F5. Agora vai aparecer um botão para criar um Feed


#Criando um Feed no Azure DevOps Artifacts

# Passo 05: Informe o nome do seu Feed/repositório NuGet, selecione Visibility para specific people e clique em Create.

Passo 05: Informe o nome do seu Feed/repositório NuGet, selecione Visibility para “specific people” e clique em Create.

Passo 05: Informe o nome do seu Feed/repositório NuGet, selecione Visibility para “specific people” e clique em Create.

# Passo 06: Clique no botão Connect to feed. Vai aparecer um popup com alguns links e botões, são eles:

  • Package source Url: Link para ser configurado no Visual Studio para consumir esse repositório NuGet Package.
  • Get the tools: NuGet.exe customizado já com autorização para publicação de pacotes NuGet nesta conta do Azure DevOps.
  • Add this feed: Command line para incluir esse repositório NuGet como fonte para receber novos pacotes.
  • Push a package: Command line para fazer upload de um pacote NuGet a esse repositório NuGet .

Passo 6: Clique no botão Connect to feed. Vai aparecer um popup com alguns links e botões

# Passo 07: Clique no botão Download NuGet + Credential Provider. Descompacte esse arquivo dentro da pasta c:\NuGet\ e substitua o NuGet.exe existente.


#4 – Publicação do Pacote NuGet no Azure DevOps

# Passo 08: Abra o command line da sua máquina na pasta onde foi gerado o pacote FSL.Framework.Core.1.0.0.nupkg.

# Passo 09: Copie e cole no command line de Add this feed que está no popup Connect to feed do Passo 06. Altere apenas o nuget.exe para c:\NuGet\NuGet.exe e pressione ENTER.

c:\NuGet\NuGet.exe sources Add -Name "FabioSilvaLima" -Source "https://fabiosilvalima.pkgs.visualstudio.com/_packaging/FabioSilvaLima/nuget/v3/index.json"

# Passo 10: Copie e cole o command line de Push a package que está no mesmo popup do Passo 06, MAS… substitua my_package.nupkg para o pacote FSL.Framework.Core.1.0.0.nupkg. Altere também o nuget.exe para c:\NuGet\NuGet.exe e pressione ENTER.

c:\NuGet\NuGet.exe push -Source "FabioSilvaLima" -ApiKey AzureDevOps FSL.Framework.Core.1.0.0.nupkg

Isso fará com que esse pacote FSL.Framework.Core.1.0.0.nupkg seja publicado em Artifacts no Azure DevOps da sua conta, especificamente no repositório FabioSilvaLima.

Pode ser que apareça o popup pedindo autenticação da sua conta Microsoft, a mesma que você usou para criar a conta no Azure DevOps.

Passo 11: Volte lá no Azure DevOps, feche o Popup Connect to feed e atualize a página F5. Vai perceber que agora existe um pacote NuGet instalado. Se clicar no nome do pacote que está na lista, serão mostradas diversas informações deste pacote, vide abaixo:

Volte lá no Azure DevOps, feche o Popup Connect to feed e atualize a página F5. Vai perceber que agora existe um pacote <strong><noscript><img src=Não tenho MVP e daí?


#5 – Consumir o Pacote NuGet publicado em outra aplicação.

Bom, pacote criado e publicado, repositório criado, agora falta consumir o FSL.Framework.Core em outro projeto qualquer. Vamos criar uma nova aplicação para fazer este consumo.

# Passo 01: Clique em File, New e depois Project. Preencha os campos com as seguintes informações:

  • Name: FSL.Site.Mvc
  • Location: c:\inetpub\wwwroot\Tutorial2
  • Solution Name: FSL.Site
  • Framework: 4.7.1

Clique em File, New e depois Project

# Passo 02: Escolha Web, e .NET Framework. Depois, escolha MVC e dê o nome de FSL.Site.Mvc.

Escolha Web, e .NET Framework. Escolha MVC e dê o nome de FSL.Site.Mvc

# Passo 03: Atualize o pacote NuGet Newtonsoft JSON para o projeto FSL.Site.Mvc.

# Passo 04: Acesse o NuGet Package Manager na solution FSL.Site.Mvc. Troque o Package source para FabioSilvaLima e clique na guia Browse.

Troque o Package source para FabioSilvaLima e clique na guia Browse

# Passo 05: Clique sobre pacote FSL.Framework.Core para aparecer mais informações e depois clique no botão Install.

O NuGet irá instalar esse pacote FSL.Framework.Core no projeto FSL.Site.Mvc e todas as suas dependências, no caso o Newtonsoft JSON.

Pulo do gato: o Project source FabioSilvaLima só apareceu no package manager porque a gente rodou o comando do Passo 09 do tópico #5. Você poderia também ter configurado isso manualmente no Visual Studio através de Tools, Options, Nuget Package Manager, Package Sources.

Tools, Options, NuGet Package Manager, Package Sources



Eu Apoio


#Bônus: Gerando uma nova versão para um pacote existente.

O que faremos?

Iremos criar novas features para FSL.Framework.Core, gerar uma novo pacote com nova versão, publicar essa nova versão e a partir do projeto FSL.Site.Mvc, atualizar/consumir essa nova versão.

# Passo 05: Abra o projeto FSL.Framework.Core e instale a lib Dapper (database ORM) a partir do NuGet Package Manager da solution.

Abra o projeto FSL.Framework.Core e instale a lib Dapper (database ORM) a partir do NuGet Package Manager da solution
# Passo 06: Compile o projeto em modo Release.

# Passo 07: Abra o arquivo FSL.Framework.Core.nuspec e altere os campos version e Release Notes conforme abaixo:

  • version: 1.0.1
  • releaseNotes: Framework Version with Dapper

# Passo 08: Rode o comando para criar um novo pacote NuGet:

c:\NuGet\NuGet.exe pack FSL.Framework.Core.csproj  -prop Configuration=Release

# Passo 09: Rode o comando para publicar esse novo pacote NuGet versão 1.0.1 no Azure DevOps:

c:\NuGet\NuGet.exe push -Source "FabioSilvaLima" -ApiKey AzureDevOps FSL.Framework.Core.1.0.1.nupkg

# Passo 10: Abra a tela do Artifacts do Azure DevOps e veja que agora aparece uma nova versão 1.0.1. Clique sobre ela e nos detalhes, repare que agora ela depende do Dapper.

# Passo 11: Abra o projeto FSL.Site.Mvc e acesse o NuGet Package Manager. Ele vai acusar uma atualização para a lib FSL.Framework.Core na versão 1.0.1.

Abra o projeto FSL.Site.Mvc e acesse o NuGet Package Manager. Ele vai acusar uma atualização para a lib FSL.Framework.Core na versão 1.0.1

# Passo 12: Clique no checkbox em FSL.Framework.Core e em seguida clique no botão Update para Atualizar o FSL.Framework.Core.


#Considerações finais

Consumir um pacote NuGet que está em um Feed no Azure DevOps não é nada diferente que consumir qualquer outro pacote NuGet. Atente-se pelo fato de que você precisa alterar a version do arquivo XML do pacote NuGet quando precisar criar e publicar uma nova versão.

Faltou alguma coisa? Encontrou erro?
Comente, critique, compartilhe!

Obrigado e até a próxima!


#Artigo relacionado

Que tal guardar e versionar seu código fonte no GIT do Azure DevOps?
Clique aqui ou na imagem abaixo e siga o tutorial.

Tutorial: Controle seu Código Fonte de Graça com GIT e Azure DevOps

Sobre o Autor:
Trabalha como arquiteto de soluções e desenvolvedor, tem mais de 18 anos de experiência em desenvolvimento de software em diversas plataformas sendo mais de 16 anos somente para o mercado de seguros.
Revisado por:
Acredita e trabalha para que a Tecnologia vinculada às suas expertises melhore a experiência e traga benefícios aos usuários. Desenvolvedora na plataforma .NET da Microsoft, com foco no ramo de seguradoras. Apaixonada por metodologias ágeis, é certificada em Agile SM e defende sua utilização.


Apaixonado por tecnologia e sempre disposto a encarar novos desafios, atualmente trabalho focado em aplicações web e mobile com a plataforma .NET, e me aventurando nas diversas linguagens, desafios e experiências que a área nos proporciona.