TIPS #4 Central Package Management Nuget in .NET project

TIPS #4 Central Package Management Nuget in .NET project

NUGET Centraliziamo i Package nei progetti .NET

Con la versione di Nuget 6.2 è possibile centralizzare le dipendenze di package aggiungendo semplicemente il file Directory.Packages.props al progetto.

Nel file .props creato occorre innanzitutto abilitare il central package managment tramite il tag:

<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>

Ed infine spostare i package con il version del pacchetto utilizzato.

Se ad esempio in un .csproj abbiamo una configurazione di package del tipo:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <AssemblyVersion>1.2024.1.3</AssemblyVersion>
        <FileVersion>1.2024.1.3</FileVersion>
    </PropertyGroup>
    <ItemGroup>
      <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.2" />
      <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
    </ItemGroup>
    <ItemGroup>
      <ProjectReference Include="..\DirectoryPackagesTest.Lib\DirectoryPackagesTest.Lib.csproj" />
    </ItemGroup>
</Project>

Basterà semplicemente cancellare il tag Version dal PackageReference e spostare l’ItemGroup compreso di Version nel file Directory.Packages.props, quindi nel caso in esempio avremo:

Directory.Packages.props

<Project>
    <PropertyGroup>
        <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
        <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.2" />
    </ItemGroup>
</Project>

Mentre il contenuto del nostro .csproj diventa:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <AssemblyVersion>1.2024.1.3</AssemblyVersion>
        <FileVersion>1.2024.1.3</FileVersion>
    </PropertyGroup>
    <ItemGroup>
      <PackageReference Include="Microsoft.Data.SqlClient" />
      <PackageReference Include="Newtonsoft.Json" />
    </ItemGroup>
    <ItemGroup>
      <ProjectReference Include="..\DirectoryPackagesTest.Lib\DirectoryPackagesTest.Lib.csproj" />
    </ItemGroup>
</Project>

In questo modo per Solution con tanti progetti abbiamo un unico punto centralizzato dove avere un unico versionamento dei package nuget.

Rules

Ogni progetto di una Solution può avere il suo Directory.Packages.props, la regola principale di lettura è la seguente: viene valutato un solo file .props per progetto.

Se ad esempio ci troviamo un una codizione del genere:

Repository
 |-- Directory.Packages.props
 |-- Solution1
     |-- Directory.Packages.props
     |-- Project1
 |-- Solution2
     |-- Project2

Il progetto1 leggerà .props nella cartella Repository\Solution1 Il progetto2 leggerà .props nella cartella Repository\

Transitive package

E’ possibile gestire le versioni dei transitive package semplicemente abilitado la funzione tramite il tag:

<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>

E specificando la versione in override del package nel .csproj con il tag VersionOverride

<PackageReference Include="Microsoft.Data.SqlClient" VersionOverride="7.0.0" />

Conclusioni

Questa funzionalità di nuget permette di gestire in maniera precisa e ordinata i packages che a livello di Devop molte volte creano numerosi problemi specialmente con solution molto grosse e gestite male in caso gruppi di lavoro grossi.

Riferimenti: NUGET Central Package Management

Enjoy =)

Don’t Accept the Defaults - Abel Wang

comments powered by Disqus

Related Posts

Backstage Spotify - building developer portals

Backstage Spotify - building developer portals

Mi è capitato nella mia lunga carriera (30 anni) di lavorare per diverse aziende, ma trovarne una che aveva un’adeguata documentazione sugli standard per sviluppare è stato pura utopia.

Read More
Rebus lean service Bus implementation for .Net

Rebus lean service Bus implementation for .Net

Rebus .Net Sempre per la serie “Don’t Accept the Defaults” ormai mio mantra di vita, cercavo una libreria semplice, veloce, ed affidabile per gestire al meglio le code di RabbitMQ.

Read More
TIPS #3 Unit Test Fake Data with Bogus

TIPS #3 Unit Test Fake Data with Bogus

Unit Test Uno dei problemi quando si scrive una UT è quello di lavorare con dei dati fake, simulare accessi ai database etc.

Read More