Nuget: de app store voor Open Source projecten

De afgelopen maanden en zeker de afgelopen weken zijn redelijk geruisloos een aantal interessante innovaties door Microsoft op de markt gebracht. Ik noem even Asp.Net MVC3, WebMatrix, IISExpress, LightSwitch en Sql Server Compact 4. Tussen al die grote jongens zat ook een onopvallend stukje
innovatie genaamd Nuget.

nuget

Nuget kan het beste omschreven worden als een app store (of market place)
voor opensource projecten. Inmiddels zijn binnen Nuget meer dan 500 bekende en minder bekende open source initiatieven opgenomen. Ik noem b.v. Log4Net,
nHibernate, Elmah, en nUnit. Natuurlijk zijn deze projecten altijd al vrijelijk
op het internet te vinden maar dan moet je ze wel weten te vinden 🙂 En daarnaast zijn er nog de installatie-perikelen en mogelijke afhankelijkheden met andere projecten.

Maar nu hebben we nuget. Hiermee komt het volgende binnen bereik:

  • – Eén galerij met alle
    opgenomen open source projecten, compleet met search
  • – Integratie met Visual Studio 2010
  • – Automatische installatie en deinstallatie
    • Referenties plaatsen naar dll’s
    • Config files uitbreiden met instellingen
    • Extra mappen en bestanden binnen je project aanmaken
    • Uitvoeren van script tijdens installatie en/of deinstallatie
    • Gerelateerde projecten worden ook meegenomen
    • Na deinstallatie wordt alles weer netjes opgeruimd
    • Etc.
  • – Mogelijkheid om extra Powershell scripts te draaien om naderhand dynamisch je projecten aan te passen (zoals het aanmaken van repositories of controllers)

Zie voor meer mogelijkheden de documentatie op codeplex. Overigens is het ook mogelijk om binnen een beschermde omgeving (intranet) een eigen feed toe te voegen met een eigen selectie aan packages. Dit kan via een gesharede map of via een eigen (Asp.Net MVC2) website.

Maar wat moet je doen om een project in de galerij te krijgen?

Stap 1: Wat wil je delen?

De afgelopen weken heb ik in een aantal blogs (1) (2) geschreven over OData in combinatie met security. Hierbij is ook een Basic Authentication implementatie getoond op basis van een HTTP Module. Deze heb ik open source gemaakt door de code te publiceren op CodePlex.

Als distributie heb ik uitsluitend voor Nuget gekozen. Dit betekent
dat ik een package opgebouwd heb die de volgende taken uitvoert:

  • 1. De HTTP Module wordt als DLL toegevoegd aan een web project en een referentie wordt aangemaakt
  • 2. In de web.config wordt de HTTP Module gerefereerd zodat deze bij het starten van de website geladen wordt.
  • 3. Ter informatie wordt de authenticatie modus op None gesteld binnen de web.config
  • 4. Een xml bestand met voorbeeld credentials wordt in de App_Data map geplaatst
  • 5. Een test web-pagina wordt toegevoegd als referentie om de werking te testen. Hierin wordt de de namespace van het project gemerged via een transformatie van $rootnamespace$.

Stap 2: zorg voor een download van de Nuget command line tool

Download  de commandline tool waarmee een package samengesteld kan worden. De exe zal straks gebruikt gaan worden.

Stap 3: Stel de documenten voor de package samen en genereer de package

Maak de volgende directory structuur aan. Ik heb daar de volgende
bestanden geplaatst:

Package
SimpleBasicAuthentication.0.1.nuspec
Content
web.config.transform
TestSimpleBasicAuthentication.aspx.cs.pp
TestSimpleBasicAuthentication.aspx.designer.cs.pp
TestSimpleBasicAuthentication.aspx.pp
App_Data
UserCredentials.xml
Lib
SimpleBasicAuthentication.dll
SimpleBasicAuthentication.pdb
SimpleBasicAuthentication.XML

(Mappen zijn cursief gemaakt)

Hierboven staan de bestanden die samengesteld gaan worden tot de
.nupkg die hieronde in de out directory geplaatst gaat worden.

Package
Out
SimpleBasicAuthenticationModule.0.1.nupkg
Download
NuGet.exe
NuGet Spec.cmd
NuGet Update.cmd
NuGet Pack.cmd

(Mappen zijn cursief gemaakt)

De gedownloade nuget.exe heb ik in de download map geplaatst.
Vervolgens heb ik een aantal cmd bestandjes gemaakt uit gemakzucht om de
gewenste acties uit te voeren.

In SimpleBasicAuthentication.0.1.nuspec zijn basale instellingen
opgeslagen zoals een package naam, auteurs, website en icoon. Deze is in de
basis aangemaakt met de NuGet Spec.cmd

NuGet.exe spec

Overigens is het verstandig om eerst te controleren of er een nieuwere versie
van nuget.exe is. Dit heb ik in enkele dagen al twee keer meegemaakt. De
bestaande exe wordt dan vervangen door een nieuwe versie en de oude wordt
hernoemd tot NuGet.exe.old. Draai hiervoor NuGet Update.cmd

NuGet.exe update

Hierna kan de package gegenereerd worden. Draai hiervoor NuGet
Pack.cmd

NuGet.exe pack ..\SimpleBasicAuthentication.0.1.nuspec -o
..\out

Hiermee worden alle bestanden samengevoegd in de SimpleBasicAuthenticationModule.0.1.nupkg. Zo’n package is overigens een zip
bestand die met bv. winzip uitgepakt kan worden…

Stap 4: Lokaal testen

De package kan nu al getest gaan worden. Voeg de out map toe als
‘feed’ aan delijst van package sources:

Lokaal testen

Hierna is de package lokaal te testen. Probeer jouw package maar eens toe te
voegen aan jouw (web) project:

lokale feed

Wie zijn package in een gesloten omgeving wilt toepassen, zoals in een
intranet, is nu klaar. Wil je de package aan de officiele feed toevoegen, dan
zijn er nog twee extra stappen.


Stap 5: (tussendoor) Publiceer je open source project

Ik heb de code achter mijn package in codeplex beschikbaar gesteld.
Dit geeft namelijk de mogelijkheid aan gebruikers om meer te weten te komen over de werking en ik heb ook een forum om eventuele problemen te loggen. Nuget stelt zelf bv. ook Github voor.

Stap 6: Maak een account aan op de Nuget galerij en publiceer je package

Als je een nieuw account aanmaakt dan zal dit met een verificatie mailtje
beantwoord worden. Ik heb begrepen dat het aanmelding momenteel nog handmatig verwerkt worden. Dit verificatie maitje wordt voor twee zaken gebruikt, voor verificatie en het kenbaar maken welke project je wilt aanbieden.

Nuget

“Click on this link (..) to verify your email address … and … Reply to
this email with a link to the project that you own or plan to upload (e.g. on
github, etc…)”.

Ik heb dus een mailtje teruggestuurd met een link naar mijn codeplex
site. Ik kreeg daarna een nette mail terug: “Your account is now approved”.

Vervolgens kan je dan eindelijk met het account packages gaan
toevoegen. Dit gebeurt met de hierboven beschreven nuget.exe:

nuget push -source http://packages.nuget.org/v1/ MyPackage.1.0.nupkg [SECRET
ACCESS KEY]

Dit is belangrijk. Je krijgt een unieke key toegewezen (die je ook opnieuw
kunt laten genereren). Met die key kun je de gegeneerde .nupkg in de galerij
plaatsen. De unieke key voorkomt op eenvoudige wijze dan een ander nooit jouw
package kan gaan kapen. Vervolgens kun je de pagina in de galerij nog verfraaien
met extra informatie en bv. een screendump.

gallerij

Ga voor mijn bovenstaande bijdrage naar de galerij.

Conclusie

Het concept achter Nuget is niet uniek. Er zijn meer van dit soort distributiekanalen voor bv. de linux omgeving. Maar voor Visual Studio geeft dit
compleet nieuwe dimensie in het gebruik en de acceptatie van open source. Opeens kunnen we zonder drempels en overzichtelijk open source projecten gaan uitproberen en uitwisselen. Wanneer zie ik jouw package in de galerij? Ik hoor het graag in de comments!

Naschrift: Nuget is slechts een handig distributiesysteem (automatische configuratie, updates, etc.) en is een gratis Add-On op Visual Studio. Als de referenties gelegd zijn dan zien collega’s zonder Nuget alleen een extra .config (met informatie voor Nuget) in de root van de applicatie staan. Alles blijft gewoon werken.