O NuGet é um gerenciador de dependências para a plataforma .NET. Ele define como os pacotes desta plataforma são criados, publicados e consumidos. Fornecendo ferramentas para cada uma dessas funções.
Curso C# (C Sharp) - TDD
Conhecer o cursoEstrutura de um pacote NuGet
Caso não esteja familiarizado com desenvolvimento .NET, antes de falar da estrutura de um pacote NuGet, é importante compreender que nesta plataforma podemos criar projetos de biblioteca, ou apenas biblioteca. Este tipo de projeto não pode ser executado diretamente, ele não é um executável. Trata-se de códigos úteis para outros projetos.
Ao ser compilada, uma biblioteca gera um arquivo DLL. Será esta DLL que os outros projetos irão utilizar. O NuGet aproveita desta característica da plataforma para definir seus pacotes.
Na prática, um pacote NuGet é um arquivo compactado com a extensão .nupkg que contém um código compilado (DLL), outros arquivos relacionados a este código (como imagens, etc.) e um arquivo de configuração que contém informações sobre o pacote, como: número de versão, criador, etc.
Estes pacotes .nupkg podem ser publicados em repositórios públicos ou privados, onde os desenvolvedores podem consumi-los, adicionando-os em seus projetos e utilizando no código as funcionalidades que fornecerem.
Distribuição dos pacotes
Para facilitar a distribuição dos pacotes, o NuGet mantém um repositório público, o NuGet.org, onde qualquer desenvolvedor pode publicar, pesquisar e consumir pacotes. Contendo mais de 100.000 pacotes, este repositório é utilizado por milhões de desenvolvedores .NET/.NET Core todos os dias.
Entretanto, o NuGet também permite a criação de repositórios privados ou locais. Assim, um desenvolvedor não precisa publicar em um repositório público um pacote crítico que é utilizado apenas pelos projetos da sua empresa.
Independente do tipo do repositório, ele funciona como a ligação dentre os criadores dos pacotes e os desenvolvedores que os consome. Podemos ilustrar isso com a imagem abaixo:
Os criadores publicam os arquivos .nupkg nos repositórios, onde os desenvolvedores podem pesquisá-los e adicioná-los nos projetos .Net.
Gerenciamento dos pacotes
Da mesma forma que outras plataformas, o .NET está disponível em várias versões, consequentemente, o desenvolvedor que estiver criando um pacote precisa definir para qual versão da plataforma ele será compatível. Um mesmo pacote pode ser compatível com uma versão específica ou várias.
Ao ser consumido, o NuGet irá analisar se o pacote é compatível com a versão do .NET definida no projeto destino. Caso não seja, ele não será adicionado ao projeto. Isso também vale para as dependências deste pacote.
Assim como qualquer projeto, um pacote pode fazer uso de outros pacotes. Mas o desenvolvedor não precisa se preocupar com isso, pois o NuGet irá cuidar de qualquer dependência de nível inferior que houver.
Para compreender melhor este ponto, a imagem abaixo ilustra bem como funciona esta “árvore” de dependência (o NuGet também dá o nome de “grafo de dependência”):
Observe que na imagem alguns pacotes se repetem. Quando isso ocorrer, o pacote em questão não será obtido várias vezes. Mesmo que sejam versões diferentes, o NuGet irá verificar qual versão do pacote pode ser compartilhada entre todos que o referenciam e irá obter apenas esta versão.
Ferramentas e outras características do NuGet
Este gerenciador de pacotes fornece uma ferramenta de linha de comando que permite criar, pesquisar e instalar pacotes. O NuGet CLI pode ser obtido no NuGet.org, entretanto, como o SDK do .NET Core e o Visual Studio (tanto a versão para Windows, quanto a de MacOS) já fornecem suporte a este gerenciador, ele raramente é utilizado.
Outro motivo do pouco uso desta ferramenta de linha de comando é a falta de suporte a projetos do Visual Studio.
Todo projeto .NET possui um arquivo onde serão salvas suas configurações. Por exemplo, um projeto de console simples, definirá um arquivo similar ao abaixo:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>
Comumente conhecido como “arquivo de projeto”, ele também é utilizado pelo NuGet registrar os pacotes que estiverem sendo utilizados. Porém, caso um pacote seja instalado com o NuGet CLI, ele não é registrado neste arquivo.
Quando registrado, o pacote é indicado em uma tag <PackageReference>
que contém o nome e a versão utilizada:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
</Project>
Assim, caso seja utilizada apenas o NuGet CLI, é necessário que esta tag <PackageReference>
seja adicionada manualmente e a ferramenta é utilizada para restaurar os pacotes do projeto.
Por serem utilizados em tempo de compilação e execução, não é necessário que os binários dos pacotes sejam compartilhados junto com o código do projeto. Mas antes de ser compilado na máquina destino, os pacotes precisam ser restaurados.
Utilizando o NuGet CLI, isso é feito com o comando nuget install
. Já o SDK do .NET e o Visual Studio realiza este procedimento automaticamente quando o projeto for compilado ou executado.
Curso C Avançado
Conhecer o cursoConclusão
Esta foi uma breve introdução do NuGet. Por ser uma ferramenta integrada a plataforma .NET, muitos não dão o devido valor que este gerenciador de pacotes merece.
Mas como vimos aqui, o trabalho de um gerenciador de pacotes é muito importante e, ao menos o NuGet, não se resume apenas em baixar os arquivos dos pacotes. Para que seja eficiente são realizadas muitas tarefas nos bastidores.
Caso queria conhecer mais sobre esta ferramenta, já abordei a criação de repositórios para ela.