Definindo de forma única a versão de bibliotecas Nuget em soluções com múltiplos projetos com Central Package Management.

Marcio Nizzola
3 min readMar 22, 2024
Definindo de forma única a versão de bibliotecas Nuget em soluções com múltiplos projetos com Central Package Management

Se você já precisou atualizar a versão de bibliotecas Nuget, e passou pela confusão que é a gestão de versão de pacotes dentro de uma solução que tem múltiplos projetos (quem nunca….) você já vai entender o que eu estou falando, vamos ao caso.

Problema

Um componente fundamental do NuGet é o gerenciamento de dependências. Pode ser simples gerenciar dependências para um único projeto. Em projetos mais complexos onde uma solução possui N projetos de bibliotecas separadas, começa o problema.

Aí vem a solução, podemos utilizar os recursos de gerenciamento central de pacotes (Central Package Management) do NuGet para organizar as dependências compartilhadas para vários projetos, tudo em um local só.

Como funciona

Como são gerenciadas as dependências no .NET :

  • packages.config: Um arquivo XML que os tipos de projeto anteriores usavam para controlar os pacotes que o projeto referenciava.
  • <PackageReference />: As dependências do pacote NuGet são definidas por um elemento XML que é utilizado em projetos do MSBuild.

Como melhorar

Para realizar a organização não é uma tarefa automática, temos que manualmente criar um arquivo “Directory.Packages.props” na raíz da solução (ele age de forma hierárquica para os projetos que estão dentro da pasta).

Daí, dentro deste arquivo temos que montar uma estrutura XML onde iremos mencionar os pacotes que queremos personalizar, e a versão a ser utilizada de forma global naquele projeto.

<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>

O segredo está na linha “PackageVersion” que é muito similar ao que encontramos em cada projeto nosso, vejam:

No projeto temos:

<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

Podemos copiar a mesma linha alterando a palavra para “PackageVersion” e inserindo-a no arquivo que criarmos !

Mas temos que alterar no projeto também, retirando a informação da versão, que virá do arquivo central agora.

No projeto deve ficar assim:

<PackageReference Include="Newtonsoft.Json" />

Desta forma, toda vez que os projetos forem buscar referências, elas virão do arquivo central, assim bibliotecas que davam trabalho para atualizar, passam a funcionar de forma centralizada.

Fiz um projeto exemplo para demonstrar, vejam este caso:

Vou alterar a referência lá no arquivo: Directory.Packages.props para uma versão posterior, ficando assim:

<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

Agora basta recompilar a solução:

Pronto, garantimos agora que as versões serão sempre atualizadas ao mesmo tempo, ganhando tempo e padronização !

Isso vai ajudá-los muito quando forem migrar aplicações legadas com múltiplos projetos !

Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.