Utilizzare e distribuire librerie gratuite in Visual Studio 2010 con NuGet
a cura di Alessandro Del Sole (requisiti: nessuno)Introduzione a NuGet
L'open source è una realtà ormai consolidata nella comunità di sviluppatori di tutto il mondo; spesso anche noi ci troviamo ad utilizzare nei nostri progetti librerie gratuite prodotte da altri sviluppatori, che magari semplificano il nostro lavoro consentendoci di risolvere delle problematiche senza dover reinventare la ruota o senza costringerci a perdere altro tempo studiando tecnologie e nuove tecniche di programmazione. Pensiamo a librerie come jQuery, NHibernate, Castle, tanto per citarne alcune famose.
E' anche altrettanto frequente che le stesse librerie vengano da noi utilizzate in più progetti e questo ci porta a dover ripetere tutta una serie di passaggi, in particolare l'aggiunta di riferimenti alle librerie di interesse, ma anche e soprattutto alle eventuali dipendenze, quindi altre librerie che sono richieste per il corretto funzionamento. Purtroppo le dipendenze non sempre accompagnano la libreria da utilizzare. Spesso, infatti, vanno reperite e referenziate a mano. Questo chiaramente comporta una perdita di tempo e il rischio di qualche dimenticanza.In questo contesto si inserisce NuGet. Si tratta di un'estensione per Visual Studio 2010 creata dal team di ASP.NET a Redmond che, tramite un'apposita galleria di pacchetti, consente con pochi clic di reperire librerie open source, di scaricarle, di aggiungere automaticamente i riferimenti nel nostro progetto e di scaricare e referenziare anche le dipendenze della libreria utilizzata. Non solo: i pacchetti per NuGet consentono il multi-targeting, quindi più versioni della stessa libreria possono essere incluse e avere come destinazione diverse versioni del .NET Framework.
In questo articolo introdurremo NuGet sia dal punto di vista della fruizione di librerie sia dal punto di vista della condivisione delle proprie con altri sviluppatori, attraverso Visual Studio 2010. Tra l'altro, NuGet stesso è un progetto open source su CodePlex, il che vuol dire che possiamo scaricare il suo codice per imparare qualcosa di nuovo.
(n.d.r.: per ragioni di impaginazione, le figure sono ridimensionate, ma sono collegate alle corrispondenti figure originali, per vedere queste basta fare clic su quelle)
Download e installazione
Scaricare e installare NuGet è semplicissimo. Utilizziamo lo strumento Extension Manager, disponibile nel menu Tools di Visual Studio 2010, e selezioniamo la ricerca online di estensioni. Digitiamo NuGet nel campo di ricerca finché lo strumento non rileva il tool nella galleria di estensioni:![]()
Selezioniamo l'estensione, facciamo clic su Download e attendiamo il completamento dell'operazione.
Utilizzo di NuGet
Come detto, NuGet permette di reperire librerie open source o, comunque, gratuite. Tali librerie vengono preliminarmente pubblicate sul sito ufficialie di NuGet, in modo da avere un unico repository centralizzato.
Supponiamo di voler utilizzare l'SDK di Facebook in una nostra applicazione. Per fini dimostrativi creiamo una semplice applicazione Console, linguaggio a propria scelta. In circostanze normali dovremmo andare a cercare l'SDK di Facebook chissà dove, attraverso un motore di ricerca o comunque perdendo tempo a trovare l'indirizzo corretto; facendolo con NuGet, invece, tutto viene reperito attraverso Visual Studio, dipendenze incluse.
Per attivarlo, dopo aver salvato la soluzione, in Solution Explorer facciamo clic destro sul nome del progetto e selezioniamo Add Library Package Reference. A questo punto comparirà una finestra di dialogo molto simile all'Extension Manager, che ci permetterà di visionare l'elenco dei package disponibili nella galleria di NuGet, di filtrare il risultato digitando un lemma per la ricerca e di sfogliare le pagine:![]()
Selezioniamo quindi il pacchetto Facebook SDK. A questo punto vedremo una descrizione sulla destra e, quando pronti, facciamo clic su Install. Al nostro clic la libreria verrà scaricata unitamente alle varie eventuali dipendenze e tutti i riferimenti necessari verranno automaticamente aggiunti al nostro progetto, come rilevabile da Solution Explorer:
![]()
Potremo quindi utilizzare le classi esposte dalla libreria desiderata facendo riferimento alla documentazione della libreria stessa. Quindi, come vedete, l'utilizzo di NuGet ci ha semplificato la vita in diversi contesti:
- ci ha permesso di reperire una libreria open source senza che noi sapessimo dove andare a cercarla
- ha aggiunto i riferimenti alla libreria
- ha scaricato eventuali dipendenze e ha aggiunto i necessari riferimenti
Fisicamente i file vengono scaricati in una sotto-cartella del progetto chiamata Packages (questo è il motivo per il quale è necessario salvare la soluzione prima di usare NuGet). Tale sotto-cartella può contenere tante sotto-cartelle quante sono le versioni del .NET Framework per le quali esiste una specifica versione della libreria. L'elenco dei pacchetti, invece, viene conservato nel file Packages.Config che potete vedere in Solution Explorer. Si tratta di un file Xml che serve a Visual Studio per gestire l'elenco delle librerie.
Utilizzare NuGet per scaricare ed utilizzare librerie è semplice e veloce, ma il vero divertimento sta nel condividere le proprie creature con altri sviluppatori. E' quello che vedremo nella seconda parte dell'articolo.
Creare e distribuire i propri pacchetti per NuGet
Per creare e distribuire i propri pacchetti per NuGet, quindi per rendere fruibili le proprie librerie open source o comunque gratuite da parte di altri sviluppatori, il primo passaggio da eseguire è visitare il sito NuGet.org e registrarsi, tramite l'apposito link chiamato Sign In.Una volta registrati, verrà inviato un codice personale da conservare perché è quello che ci consentirà di pubblicare i nostri pacchetti (in realtà è anche possibile registrarlo sulla propria macchina una volta per tutte, scaricando il tool a riga di comando NuGet.exe e seguendo le istruzioni illustrate sul sito). Giacché vi trovate sul sito, date un'occhiata alla gallery di pacchetti. Questo vi permette di avere un'idea di come il vostro verrà elencato.
Creare pacchetti con il client a interfaccia grafica
NuGet è un tool abbastanza complicato, quando si tratta di creare i propri pacchetti.
NuGet.exe è il tool a riga di comando per generare i pacchetti, con opzioni di riga decisamente complesse, ma soprattutto è necessario creare separatamente i file dei metadati e le strutture delle directory richieste.
Per fortuna è stato creato anche un comodissimo tool che ci permette di creare i pacchetti attraverso un client ad interfaccia grafica, davvero comodo, chiamato NuGet Package Explorer. L'installazione avviene tramite la tecnologia ClickOnce e si raggiunge tramite questo link. La procedura di installazione è molto semplice e richiede due clic:![]()
Una volta in esecuzione il Package Explorer (che è un'applicazione WPF), bisogna selezionare File, New per creare il pacchetto. A questo punto il tool si presenta come in figura:
![]()
Come vedete, sulla sinistra è presente una parte dedicata ai metadati del pacchetto, quindi essenzialmente informazioni identificative. La colonna di destra andrà successivamente riempita con i file da impacchettare. Prima di passare a compilare i metadati, è chiaramente necessario avere a disposizione un progetto free, possibilmente open source. Nei prossimi passaggi viene riprodotta la procedura che io stesso ho seguito per la pubblicazione della mia libreria Neptune MVVM, disponibile su CodePlex, che consiste in un framework "light" per la creazione di applicazioni WPF basate sul pattern Model-View-ViewModel. Il package è chiaramente già disponibile nella galleria di NuGet, ma l'esempio vi aiuterà a capire cosa serve.
Per modificare i metadati si seleziona Edit, Edit Package Metadata. A questo punto i campi si sbloccano ed è possibile compilarli con informazioni identificative, come nella seguente figura:![]()
Oltre alle informazioni descrittive, che si spiegano da sole, è possibile specificare l'indirizzo del contratto di licenza e selezionare l'obbligatorietà dell'accettazione della licenza stessa. E' anche possibile specificare un'icona per la libreria, che andrà a contraddistinguere il pacchetto sia nella galleria di NuGet che nello strumento di download dei pacchetti in Visual Studio. Infine, è fondamentale sottolineare come in fondo alla finestra sia possibile specificare le dipendenze della nostra libreria, ma anche l'inclusione di assembly che fanno parte del Framework (operazione generalmente non richiesta).
Nota bene: le dipendenze devono essere a loro volta disponibili sotto forma di pacchetti NuGet, infatti l'indirizzo Web che si specificherà per ciascuna dipendenza farà riferimento all'indirizzo nella galleria NuGet della stessa.
Il passaggio successivo è quello di aggiungere i contenuti veri e propri al pacchetto. Un pacchetto NuGet può contenere le seguenti risorse:
- file generici
- assembly .NET
- script di Windows PowerShell
Nel rimandarvi alla documentazione ufficiale per quanto riguarda file e script di PowerShell, anche relativamente alle ragioni del loro supporto, ci soffermiamo sugli assembly .NET, anche perché costituiscono lo scenario più diffuso. Gli assembly vengono contenuti in una c.d. lib folder, ossia una cartella che contiene librerie. Ciascuna lib folder, però, può essere suddivisa in tante sotto-cartelle, tante quante sono le versioni del .NET Framework supportate. Può infatti accadere che vengano pubblicate diverse versioni di una stessa libreria, in modo da supportare più versioni del Framework. In ogni caso, la prima cosa da fare è selezionare Content, Add, Lib Folder come in figura:
![]()
Questa operazione inizierà a popolare l'elemento Content nella colonna di destra, con l'aggiunta di un nodo radice chiamato lib. E' su di questo che va ancora fatto clic destro per poi selezionare Add .NET Folder, quindi la versione del Framework di interesse (nel nostro caso la 4.0):
![]()
Su questa nuova cartella appena creata, il cui nome è evidentemente rappresentativo della versione del Framework prescelta, facciamo ancora clic destro e selezioniamo Add Existing File; tramite la finestra di dialogo andiamo poi a selezionare la libreria .NET che vogliamo distribuire, nell'esempio corrente DelSole.NeptuneMVVM.dll. A questo punto il file verrà aggiunto al pacchetto come si evince dalla figura:
![]()
Se non abbiamo altre aggiunte da fare, siamo già pronti per la pubblicazione.
Pubblicazione del package sulla galleria di NuGet
Per pubblicare un pacchetto sulla galleria di NuGet è sufficiente selezionare File, Publish. A questo punto ci verrà semplicemente richiesto di immettere il nostro codice personale:![]()
La richiesta del codice non verrà fatta se lo abbiamo installato in locale sulla macchina, seguendo le inidicazioni fornite nella documentazione. Dopo pochissimo tempo, quello richiesto per l'upload, il nostro pacchetto è pubblicato e può essere reperito all'interno della galleria ma lo scopo non è questo. La vera finalità è infatti quella di utilizzare il nostro pacchetto da Visual Studio 2010.
Test del proprio pacchetto
Come avete visto all'inizio dell'articolo, è dapprima necessario creare un progetto. Continuando l'esempio del framework Neptune MVVM, si crea un progetto WPF. Dopodiché si salva la soluzione, si fa tasto destro sul nome del progetto e si seleziona Add Library Package Reference. Dopo alcuni secondi, anche in considerazione del filtro di ricerca, il nostro pacchetto viene visualizzato nella finestra di dialogo di NuGet:![]()
E' sufficiente fare clic su Install e attendere il download e l'aggiunta dei riferimenti. Se Neptune MVVM avesse avuto delle dipendenze, anche queste sarebbero state scaricate e referenziate immediatamente. La seguente figura mostra l'aggiunta del riferimento e l'utilizzo di una delle classi (ViewModelBase) esposta dalla libreria:
![]()
Conclusioni
NuGet è un'estensione per Visual Studio 2010 davvero comoda e utile, che semplifica notevolmente la ricerca e l'aggiunta di librerie gratuite nei nostri progetti. Se avete seguito la conferenza MIX 2011 di Microsoft e avete visto le demo di Scott Hansellman, sapete anche quanto l'azienda di Redmond stia investendo su questo componente e il coinvolgimento diretto del team di ASP.NET ne è la prova.
Come di consueto, potete contattarmi per domande al mio indirizzo di posta elettronica o attraverso il mio blog.