Nello script precedente (https://www.aspitalia.com/script/1393/Gestire-Dipendenze-Pacchetti-NuGet-Visual-Studio-2019.aspx) abbiamo visto come in .NET Core e Visual Studio 2019 possiamo creare una solution di pacchetti NuGet e gestirne le dipendenze semplicemente impostando le project reference.
Quando utilizziamo un approccio di questo tipo, il versioning dei nostri package riveste un ruolo fondamentale. Ripensiamo al nostro progetto di esempio, in cui Package2 ha una dipendenza da Package1.
Nel momento in cui produciamo una nuova versione di uno dei due pacchetti, che magari introduce una breaking change nel modello a oggetti, dovremo innanzi tutto aumentarne il numero di versione. Ma, da solo, questo accorgimento non ci pone al riparo da potenziali problemi: se un nostro consumer installerà versioni incompatibili avrà di sicuro dei malfunzionamenti.
Il primo passo, allora, è rendere il più possibile evidente questo concetto di "compatibilità" e una best practice (utilizzata per esempio da ASP.NET Core stesso) è quella di far sì che tutti i pacchetti generati dalla stessa solution abbiano allora il medesimo numero di versione. In buona sostanza, vogliamo che Package2 di versione 2.1.35 sia compilato insieme a Package1 di versione 2.1.35.
Per essere sicuri che le versioni siano sempre allineate, possiamo sfruttare il file Directory.build.props:
Si tratta di un file XML che dobbiamo creare nella root della solution, in cui possiamo specificare le proprietà comuni a tutti i progetti della solution stessa:
<Project> <PropertyGroup> <Authors>Contoso Ltd</Authors> <Company>Contoso Ltd</Company> <Version>2.1.35</Version> </PropertyGroup> </Project>
Queste proprietà verranno automaticamente iniettate in fase di build in tutti i progetti, che così avranno (in base all'esempio in alto) gli stessi autori, ma soprattutto lo stesso numero di versione:
Si tratta di una funzionalità di MsBuild e pertanto funzionerà tanto in Visual Studio, quanto in una build pipeline per esempio su Azure DevOps.
Versioning lato consumer
La stessa tecnica può essere utilizzata per far sì che anche in una solution che sfrutta i nostri pacchetti, i vari progetti (che possono referenziare alcuni o tutti i nostri package NuGet) referenzino tutti in maniera consistente lo stesso numero di versione, così da evitare conflitti in fase di build e potenziali malfunzionamenti.
Tutto ciò che dobbiamo fare è, anche in questo caso, creare un file Directory.Build.props nella root, dove definire una variabile custom simile al codice in basso:
<Project> <PropertyGroup> <ContosoPackagesVersion>2.1.35</ContosoPackagesVersion> </PropertyGroup> </Project>
A questo punto, nei vari file di progetto, invece che fare riferimento in maniera esplicita alla versione, possiamo referenziare la variabile appena creata:
<Project Sdk="Microsoft.NET.Sdk"> ... <ItemGroup> <PackageReference Include="Package1" Version="$(ContosoPackagesVersion)" /> <PackageReference Include="Package2" Version="$(ContosoPackagesVersion)" /> </ItemGroup> ... </Project>
Quando ci troveremo ad aggiornare a una nuova versione, potremo modificare la reference unica in Directory.Build.props e tutti i progetti della solution resteranno allineati.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Creare gruppi di client per Event Grid MQTT
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Utilizzare ChatGPT con Azure OpenAI
Generare file per il download da Blazor WebAssembly
Catturare la telemetria degli eventi di output cache in ASP.NET Core
C# 12: Cosa c'è di nuovo e interessante
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Utilizzare la libreria Benchmark.NET per misurare le performance
Taggare la output cache in base al routing in ASP.NET Core
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
I più letti di oggi
- Evitare il flickering dei componenti nel prerender di Blazor 8
- Rilasciata la Beta 2 di Visual Studio 2008
- tra pochi minuti inizia la keynote della seconda giornata. seguila live su http://aspitalia.com/mix-11 #mix11
- .@dbochicchio ora su #aspnetcore 2 a #netconfit https://aspit.co/netconf-17
- Utilizzare angular-cli per creare una direttiva in Angular 2
- Windows Vista: il ritorno di WinFS con la beta1
- .@CristianCivera tra poco su #azure con i suoi tips&tricks per lo sviluppatore web: https://aspit.co/web15-live #aspilive
- Le novità di C# 10