Loading...
29-09-2023

.Net heeft een feature die het gebruik van nuget packages wat kan vereenvoudigen. De optie waar het om gaat heet ManagePackageVersionsCentrally en kan ingezet worden om de versies van de gebruikte pakketten centraal te registeren. Mogelijk dat deze optie voor mij het probleem oplost, dat ik niet in 1x alle pakketten in mijn solution kan upgraden. Soms heeft het meerdere pogingen nodig, of soms worden een aantal packageReferences simpelweg niet geupdate, wat tot rare effecten kan leiden.

ManagePackageVersionsCentrally is een optie die toegevoegd kan worden aan het bestand Directory.Packages.props. Dit bestand bestaat niet standaard en kan handmatig toegevoegd worden. In het geval van Rider heb ik nog geen optie gevonden om dit vanuit de IDE te doen, maar met de hand is het niet veel meer werkt.

Start hiervoor je favoriete teksteditor op en maak een bestaand aan met de volgende inhoud:

<Project>  
    <PropertyGroup>
		<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>  
    </PropertyGroup>
</Project>

Hierin is de optie alvast ingeschakeld. Sla vervolgens dit bestand op in de root van de solution als Directory.Packages.props. Je kan deze eventueel ook op een ander niveau van de solution neerzetten, dan geldt het voor alles wat eronder valt.

Voor de handigheid heb ik in de solution ook nog een solution folder "Solution Items" aangemaakt. Soms bestaat deze al, dus dubbel zou ik hem niet proberen aan te maken. Vervolgens heb ik het bestand hieraan toegevoegd, zodat je hem makkelijk kan aanmaken.

Kopieer vervolgens de <ItemGroup> met de <PackageReference> vanuit 1 (of meerdere) van de projecten (.csproj file) hier naar toe. Dit inclusief het versienummer. Wat dit nu doet, is dat deze packages aan alle projecten worden toegewezen. Dat is natuurlijk niet de bedoeling. Verander daarom PackageReference naar PackageVersion. Nu definieerd dit de gebruikte versie van de package, voor de plekken waar om dit package gevraagd wordt. Let wel dat je het versie attribute in de .csproj verwijderd. Doe je dat niet, dan werkt het als een override.

Nog een punt waar ik tegenaan liep. Ik gebruik regelmatig submodules met git. Als er nu een globale Directory.Packages.props toegevoegd wordt, geldt dit ook voor deze submodules. Tevens kunnen projecten die in de IDE unloaded zijn wel effect hebben bij een dotnet restore. Als deze projecten wel een version attribute bevatten, treed de error NU1009 op. Dit is op te lossen door alle projecten aan te passen, maar dat kan niet altijd, of door <WarningsNotAsErrors>NU1009</WarningsNotAsErrors> toe te voegen aan de projecten.

Update: hoewel dit concept heel interessant is, werkt het alleen goed als alle projecten hierop ingesteld zijn. Bij gebruik van submodules kan het voorkomen dat niet alle projecten aangepast zijn, wat leid tot meldingen als " error NU1008: Projects that use central package version management should not define the version on the PackageReference items...". Het lijkt erop dat deze niet te onderdrukken zijn tot nu toe.

  • .Net
  • NuGet