De voor- en nadelen van NuGet
Waarom zou je NuGet packages gebruiken voor je project? Wat is de kracht van updates en welke problemen kunnen daaruit voortkomen? In deze blog krijg je een beeld van hoe je NuGet packages maakt en hoe je deze kunt implementeren in Visual Studio.
Waarom NuGet?
Stel, je start met een splinternieuw project. Hiervoor wil je delen van code uit een ander geweldig project gebruiken. Je kopieert de bestanden of de tekst die je daaruit nodig hebt en zet deze in je nieuwe project. Simpel en doeltreffend. Toch?
Het project breidt zich uit en je schrijft allemaal nieuwe functies en methoden. Onderweg loop je tegen een kleine bug aan, maar die fiks je meteen. Tot nu toe geen wolkje aan de lucht!
Na een jaar moeten er een aantal wijzigingen doorgevoerd worden in je project. Je opent het project en merkt dat de wijzigingen en verbeteringen hierin niet zijn meegenomen. Logisch! Je gaat direct aan de slag met een tool als Beyond Compare of Total Commander om de bestanden te vergelijken met het tweede project. Je past de code aan waar nodig. Et voilà , je project is weer up-to-date. Je brengt de wijzigingen aan die vereist zijn en zonder problemen kun je een projectoplevering doen.
Dan komt er weer een nieuw project aan. Opnieuw begin je met een gloednieuw project. Je kopieert de code uit het eerste project (want de tweede loopt achter) en gaat aan de slag met bouwen. Nu voel je hem vast al aankomen: er moeten wijzigingen gedaan worden in het tweede project. Daar ga je weer: je doet een codevergelijking - wat nu steeds tijdrovender wordt, want je project groeit - en een synchronisatie van je code en bestanden.
Zou het niet veel handiger zijn als je al die mooie functies en methoden op één plek zou kunnen vinden? In één class library die je kunt gebruiken voor alle projecten? Dan hoef je slechts een nieuw project aan te maken met alleen een class library (of meerdere) en kopieer je de DLL in alle projecten waar je deze nodig hebt. Klinkt goed – of toch niet?
Welke versie?
Hoe houd je bij welke versie van de DLL je in je project hebt? Of is er alweer een nieuwe update van de DLL en – nog belangrijker – werkt die versie wel in je huidige project? Als het niet werkt, kun je dan een versie terug? Natuurlijk gebruiken we allemaal versiebeheer (zoals TFS of Git) en is de ‘oude’ DLL weer teruggezet. Toch is het omslachtig om bij te moeten houden welke versie waar draait.
Een centrale locatie: NuGet Server
Dit is precies waarom NuGet Server zo handig is. Je kunt een pakket maken waarin je de DLL stopt. Eventueel kun je alle afhankelijkheden die deze DLL heeft hieraan toevoegen. Dit pakket noemen we een NuGet package, en dit lever je aan bij de NuGet Server. Hiervoor kun je gebruikmaken van de publieke server op nuget.org. Of je kunt in je lokale netwerk een NuGet server draaien. Het pakket bevat metadata waarin onder andere de beschrijving, content en het versienummer staat.
Superhandig, want op deze manier kun je meerdere versies van dezelfde DLL bewaren. Voor het eerste project wil je misschien niet de extra methoden van de nieuwste DLL hebben, omdat die aangepast of ‘deprecated’ zijn. In principe wordt dit alleen gedaan bij Major versie wijzigingen. Bij Minor versies zijn de methoden backward compatible.
Hoe voeg je NuGet package toe in Visual Studio?
Je hebt een NuGet package gemaakt (of een NuGet package van iemand anders) die je graag wilt gebruiken in Visual Studio. Je kunt je oude project pakken, de code verwijderen die nu dubbel is en de NuGet package importeren, zodat de methoden weer beschikbaar zijn.
In je solution klik je met de rechtermuistoets op ‘Solution’. Vervolgens klik je op ‘Manage NuGet packages for Solution’.
Je selecteert de package die je wilt gebruiken en selecteert de projecten waar deze NuGet package gebruikt moet worden. Bij het selecteren van je project kun je aangeven welke versie van de package je wilt gebruiken. Klik op ‘Installeer’ en de package is geïmplementeerd!
Hoe maak je zelf een NuGet package?
Hoe maak je een NuGet package, wat kun je er allemaal aan toevoegen en wat zijn leuke features waar je absoluut gebruik van moet maken?
#1 NuGet Package Explorer
Ten eerste heb je het programma ‘NuGet Package Explorer’ nodig dat voor jou het pakket kan maken. Dit programma is te downloaden via http://npe.codeplex.com.
#2 Meta Data
Als je deze opent, kun je een nieuw package maken. Links zie je de metadata van de package. Als je dit wijzigt, zie je onder andere een ID, het versienummer en een titel.
Het belangrijkste hierbij is het ID en de versie. Het ID is een unieke naam die je aan je pakket moet geven. Let erop dat je ervoor zorgt dat deze na verloop van tijd niet meer gewijzigd kan worden. Waarom? Omdat het anders een nieuw pakket wordt, waardoor de versies niet meer werken. Je kunt het bijvoorbeeld de naam ‘MyCompany.Libraries.SuperObjects’ geven.
Voor welke versie kun je kiezen? Begin bijvoorbeeld met 1.0.0. Bij hotfixes maak je er 1.0.1 van en bij releases 1.1.0, 1.2.0 en ga zo maar door. Is er een nieuwe versie waarbij echt ingrijpende veranderingen zijn doorgevoerd? Verander dan het eerste nummer. Je krijgt dan 2.0.0, 3.0.0 en zo verder.
De rest van de velden kun je naar eigen inzicht invullen. Buiten Auteurs en Omschrijving zijn deze niet verplicht.
#3 Content
Wil je hier je DLL in plaatsen? Klik bovenaan op ‘Content’ en ‘Add Libfolder’. Daarna klik je met je rechtermuisknop op ‘Libfolder’ en selecteer je ‘Add .Net Folder -> v4.6.3.’
Nu heb je gezien dat er heel veel frameworks en veel meer foldertypes instaan. Dit is belangrijk, omdat er bij het installeren van de NuGet package in Visual Studio wordt gecontroleerd welke versie van .Net in je project gebruikt wordt, en welke DLL’s deze vervolgens moet implementeren. Je kunt hier dus je DLL aanleveren voor bijvoorbeeld .Net 3.5, .Net 4.0 en .Net 4.5.1.
Daarnaast kun je speciale folders gebruiken voor bijvoorbeeld Xamarin, Mono en Windows Phone.
In plaats van een lib folder kun je ook een src folder gebruiken, waarin je je broncode kunt zetten.
#4 Afhankelijkheden
Stel, je hebt een mooie DLL gemaakt maar die maakt zelf ook gebruik van NuGet packages. Dit noemen we Dependencies. Het mooie hiervan is dat je deze kunt toevoegen in de ‘Edit Dependencies’ en zelfs kunt aangeven op welke versie van de NuGet deze afhankelijk is.
Bij het installeren van je NuGet package controleert deze of de NuGet packages, waar deze van afhankelijk is, ook compatibel zijn met de versie die je hebt aangegeven.
#5 Speciale functionaliteiten
Zo zijn er nog talloze mogelijkheden te noemen van NuGet package. Er is bijvoorbeeld de mogelijkheid om de inhoud van .config files te manipuleren of de namespace in sourcecode bestanden te wijzigen naar je huidige namespace.
Voor een gedetailleerde uitleg kun je op de volgende link klikken: https://docs.microsoft.com/nl-nl/nuget/create-packages/source-and-config-file-transformations.
Deel je NuGet package met de wereld
Als je vindt dat andere mensen ook van jouw functionaliteit gebruik mogen maken, is delen heel simpel. Klik in NuGet Package Explorer op ‘File’ en vervolgens op ‘Publish’.
Hiervoor heb je een Publish Key nodig. Een Publish Key is persoons– of bedrijfsgebonden. Deze maak je eenvoudig aan op https://www.nuget.org/.
Een update? Geen probleem!
Zoals je gemerkt hebt worden er meerdere versies van NuGet packages gepubliceerd. In Visual Studio wordt dit aangegeven zodra je ‘Manage NuGet Packages’ hebt geselecteerd.
Maar wat als er updates zijn voor al die packages? Geen probleem! Je kunt per NuGet package aangeven of je wilt updaten en naar welke versie. Je kunt ook alles in één keer updaten.
Obstakel: TFS Versiebeheer
Misschien heb je een NuGet package geïnstalleerd en heb je dit meegenomen in TFS. Op zich geen probleem, tenzij je een nieuwe versie van een NuGet gaat installeren.
Als je een update van JQuery wilt doen, wordt eerst de oudere versie verwijderd (inclusief folders) en daarna weer geïnstalleerd (inclusief folders). Vervolgens begint TFS echter te klagen dat er nog ‘Pending Changes’ zijn voor de verwijderde folder, en dat de NuGet package niet geïnstalleerd kan worden.
Hoe los je dit op? Simpel, ‘Exclude’ de packages folder bij het inchecken en of maak een .tfignore-bestand aan in je solution waar deze map genegeerd wordt.
Heb je dan een probleem als een collega jouw project wilt openen? Nee. De NuGet packages worden automatisch gedownload bij een ‘Build’ van je solution.
NuGet: simpel en effectief!
NuGet is een geweldige en effectieve oplossing om up-to-date te blijven van de laatste versies van de libraries. Bovendien is het maken van een NuGet package en de implementatie in Visual Studio simpel. Ook zijn de problemen of obstakels die bij NuGet packages komen kijken te overzien. Conclusie: Absoluut een aanrader om hiermee te gaan werken! Binnen ETTU wordt NuGet met veel enthousiasme gebruikt en toegepast in verschillende projecten.
Wil je meer weten over deze NuGet? Of sparren over de mogelijkheden? Neem dan contact met ons op.