Alla scoperta di NuGet: introduzione
Scritto da
Giorgio Di Nardo
il
mercoledì 19 ottobre 2011
Linguaggio:
•
Framework:
•
Livello: 100
Cos'è NuGet?
NuGet è un'estensione di Visual Studio 2010 che rende più
semplice aggiungere, rimuovere e aggiornare i riferimenti a
librerie esterne in propri progetti basati sulla piattaforma .NET e
realizzati in Visual Studio. Con NuGet è più semplice sia
utilizzare librerie di terze parti all'interno dei propri progetti
.NET, sia mettere a disposizione di altri sviluppatori le proprie
librerie.
Chiunque si sia trovato in questa situazione - a meno di
lavorare in un monastero sull'Himalaya penso più o meno tutti - sa
che le cose non sono così semplici come potrebbe sembrare: in primo
luogo si tratta di trovare nel mare magnum di Internet la libreria
giusta, con la versione più aggiornata, scaricandola da una
sorgente affidabile; bisogna poi estrarre il file sul disco,
identificare e copiare tutti i file necessari (dll, js, css) ed
aggiungere un riferimento all'interno del progetto; infine
modificare opportunamente il file di configurazione aggiungendo i
settaggi trovati sulla documentazione (che avete letto vero?).
Siamo quindi pronti ad utilizzare la nostra libreria, a patto
che non abbia a sua volta dipendenze con altre librerie esterne. In
caso contrario è necessario iterare il processo verificando per
ogni libreria che la versione sia quella compatibile con gli altri
componenti utilizzati.
Abbiamo appena concluso di configurare tutto l'ambiente… che
esce una nuova versione della libreria costringendoci ripetere il
processo per aggiornare tutti i riferimenti.
L'obiettivo di NuGet è proprio di automatizzare tutto questo
processo lasciando allo sviluppare la possibilità di concentrarsi
sull'utilizzo della libreria piuttosto che sulla sua installazione
e configurazione.

Il fulcro del funzionamento di NuGet è rappresentato dai
pacchetti: tutte le informazioni necessarie all'installazione di
una libreria sono racchiuse in un pacchetto (in pratica in un file
con estensione .nupkg). Un pacchetto include i file da copiare nel
progetto di destinazione e un manifest che descrive il contenuto
del pacchetto e le operazioni necessarie per aggiungere o rimuovere
la libreria. I pacchetti sono raggruppati in feed a cui Visual
Studio può accedere per fornire agli sviluppatori un elenco dei
pacchetti disponibili. La sorgente principale a cui Visual Studio
può attingere è il feed ufficiale di NuGet, ma è possibile istruire
Visual Studio affinché attinga da feed esterni o anche creare un
proprio repository personale.
Per condividere una propria libreria è quindi sufficiente
realizzare un pacchetto NuGet e pubblicarlo in un repository NuGet
da cui poi sarà recuperato (ed installato nel proprio progetto) da
chiunque voglia farne uso.
In fase di installazione di un pacchetto, NuGet copia i file
necessari all'interno del progetto e applica automaticamente tutte
le modifiche indispensabili per il corretto funzionamento della
libreria, come ad esempio impostare i riferimenti agli assembly
importati o aggiornare il file di configurazione (app.config o
web.config a seconda del tipo progetto). In fase di rimozione di un
pacchetto, NuGet è in grado di rimuovere tutti i file aggiunti e di
rimuovere tutte le modifiche apportate fino a ripristinare lo stato
del progetto alla situazione precedente all'installazione.
Installare NuGet
NuGet può essere facilmente installato (e successivamente
aggiornato) utilizzando l'Extension Manager di
Visual Studio a cui è possibile accedere attraverso l'opzione
Extension Manager… del menù
Tools.

Nella dialog box dell'Extension Manager
selezioniamo la scheda Online Gallery sulla
sinistra e usando la casella di ricerca in alto a destra cerchiamo
NuGet.

Selezioniamo quindi il NuGet Package Manager e
installiamolo per mezzo del pulsante Download
confermando l'operazione cliccando sul pulsante
Install.
Al termine dell'installazione riavviamo Visual Studio per
consentire a NuGet di funzionare correttamente.
In alternativa è possibile installare NuGet direttamente dalla
Visual Studio Gallery scaricando ed eseguendo il file .vsix.
Anche in tal caso sarà necessario chiudere e riaprire le istanze di
Visual Studio eventualmente in esecuzione.

Utilizzare il dialog box Manage NuGet Packages
Ora che NuGet è installato e funzionante, il modo più semplice
per cercare, installare, aggiornare e rimuovere pacchetti NuGet è
senza dubbio quello di utilizzare la dialog box Manage
NuGet Packages.
Cercare un pacchetto
Dopo aver aperto la nostra Web Application, nel
Solution Explorer clicchiamo con il tasto destro
sul nodo References e selezioniamo quindi
Manage NuGet Packages… dal menù contestuale (se il
nostro progetto è invece un Website possiamo
eseguire la stessa operazione a partire dal nodo
Bin).

La dialog box è divisa orizzontalmente in tre parti e presenta
la stessa struttura che caratterizza l'Extension
Manager di Visual Studio. Il menù a schede presente nella
sezione di sinistra consente di accedere rapidamente alla lista dei
pacchetti già installati nel progetto selezionato -
Installed packages - a quelli referenziati di
recente - Recent packages - o a quelli disponibili
nei repository configurati - Online.
Clicchiamo sulla scheda Online.

Per impostazione predefinita i pacchetti vengono ordinati sulla
base del maggior numero di download effettuati, in modo da mostrare
già nella prima pagina i pacchetti generalmente più utilizzati. È
comunque possibile cambiare l'ordinamento per mezzo del lista a
cascata che si trova in cima scegliendo l'ordinamento alfabetico -
Name: Ascending e Name:
Descending - oppure quello basato sulla valutazione degli
utenti - Highest Rated.

Per quanto sia possibile scorrere la lista usando la barra di
scorrimento sulla destra e i controlli di paginazione in fondo, è
senza dubbio più rapido effettuare una ricerca per mezzo del
controllo che si trova in alto a destra. In questo modo è possibile
filtrare l'elenco dei pacchetti sulla base di una o più parole
chiave rendendo quindi più agevole trovare il pacchetto giusto.
Proviamo a cercare il pacchetto ELMAH inserendo
la parole "elmah" o "logging".
Dopo aver selezionato il pacchetto dalla lista è possibile
consultare una serie di informazioni nella sezione di destra. Oltre
ad una breve descrizione del contenuto, le informazioni riportano
il nome del creatore del pacchetto, il numero di versione e la data
di aggiornamento, il numero di download effettuati, la valutazione
data dagli utenti (in genere purtroppo poco utile visto il
bassissimo numero di valutazioni rispetto a quello dei download) e
la presenza di eventuali dipendenze da altri pacchetti NuGet.
Installare un pacchetto
Per installare il pacchetto è sufficiente selezionarlo e
cliccare sul pulsante Install.

Grazie alle informazioni presenti nel file manifest che descrive
il pacchetto, NuGet è in grado di identificare l'albero delle
dipendenze e di installare quindi sia il pacchetto selezionato che
tutti quelli da cui questo dipende.
Alcuni pacchetti - come Ninject - potrebbero richiedere
l'accettazione di una licenza. In tal caso viene mostrata una
finestra di dialogo che consente di consultare i termini della
licenza e di accettarli o declinarli (in quest'ultimo caso
ovviamente l'installazione del pacchetto viene annullata).

I file necessari vengono quindi copiati all'interno del
progetto, i riferimenti alle librerie vengono aggiunti se
necessario e i file di configurazione vengono opportunamente
modificati.
Al termine dell'installazione il pulsante
Install lascia spazio ad un'icona che indica il
corretto completamento della procedura di installazione.

Per meglio capire cosa è avvenuto dietro le quinte, esaminiamo
nel dettaglio le modifiche apportate da NuGet al progetto dopo
installazione del pacchetto ELMAH.
Intanto, come ovvio, è stato aggiunto un riferimento alle
librerie installate con il pacchetto tra le
References del progetto.

In secondo luogo il file web.config è stato modificato con
l'aggiunta delle impostazioni necessarie al corretto funzionamento
di ELMAH.

Infine, nella cartella della soluzione - o in quella del
progetto nel caso in cui il progetto non preveda una cartella
specifica per la soluzione - NuGet ha creato una cartella
packages che conterrà una sottocartella per ogni
pacchetto installato.

La sottocartella contiene tre diversi elementi: il file .nupkg
che rappresenta il pacchetto, che poi altro non è se non un
archivio .zip contenente tutti i file che lo compongono; una
cartella bin nella quale si trovano gli assembly
che saranno referenziati nel progetto; una cartella
content nella quale si trovano i file aggiuntivi
con la stessa alberatura con la quale saranno riportati da NuGet
all'interno del progetto.

Aggiornare un pacchetto
La grande utilità di NuGet non si esaurisce con l'installazione
di un pacchetto ma anzi fornisce un supporto fondamentale anche in
fase di aggiornamento.
Apriamo nuovamente il dialog box Manage NuGet
Packages e selezioniamo sulla sinistra la scheda
Updates. Nell'elenco centrale saranno riportati
tutti i pacchetti installati nel progetto per i quali è disponibile
un aggiornamento.

Come possiamo vedere pur avendo installato solo il pacchetto
ELMAH - per il quale ovviamente non risultano aggiornamenti - NuGet
ci propone l'aggiornamento di una nutrita serie di pacchetti. Ciò è
dovuto al fatto che il template di Visual Studio con il quale
vengono creati i progetti ASP.NET MVC non referenzia le varie
libreria in maniera statica ma come pacchetti NuGet. In questo modo
anche i componenti che fanno parte del template - come ad esempio
jQuery o Entity Framework - possono essere facilmente gestiti ed
aggiornati alla stessa stregua di quelli aggiunti
successivamente.
Selezioniamo il pacchetto jQuery e clicchiamo sul pulsante
Update per avviarne l'aggiornamento.

L'ultima versione del pacchetto viene recuperata da NuGet e
sostituita a quella precedentemente installata nel progetto. Se
necessario NuGet provvede all'aggiornamento anche dei pacchetti
aventi dipendenze con quello aggiornato. Al termine dell'operazione
un'icona segnalerà tutti i pacchetti correttamente aggiornati.

Pur facendo un grosso lavoro, in alcuni casi NuGet potrebbe non
essere in grado di completare tutte le operazioni realmente
necessarie a garantire la completa transizione verso la nuova
versione del pacchetto.
NuGet non è infatti in grado - almeno nella versione attuale -
di modificare i file che compongono progetto - con l'eccezione dei
file di configurazione, come abbiamo già visto - per aggiornare i
riferimenti alle nuove versioni scaricate. È un problema che, ad
esempio, può riguardare le librerie javascript che includono il
numero di versione all'interno del nome del file .js, come nel caso
di jQuery.
Il tal caso nella cartella Scripts troveremo il
nuovo file mentre il tag script del file di layout
continuerà a puntare al file vecchio. Sarà quindi necessario
effettuare la modifica manualmente per continuare a garantire il
corretto funzionamento dell'applicazione.

Rimuovere un pacchetto
La necessità di rimuovere un pacchetto può nascere o
dall'eliminazione delle funzioni applicative che ne richiedevano
l'utilizzo o dall'obsolescenza del pacchetto stesso. È il caso del
pacchetto jQuery.vsdoc che conteneva i file
necessari all'Intellisense relativa a jQuery e che è stato
integrato nel pacchetto core di jQuery. In fase di
aggiornamento di jQuery all'interno del progetto viene quindi
copiato il file README.jQuery.vsdoc.txt che segnala l'obsolescenza
del pacchetto e invita alla sua rimozione.
Un pacchetto installato può essere rimosso dal progetto
selezionando nel dialog box Manage NuGet Packages
la scheda Installed Packages che come detto
riporta l'elenco dei pacchetti installati nel progetto
corrente.

Selezioniamo il pacchetto jQuery Visual Studio 2010
IntelliSense e clicchiamo sul pulsante
Uninstall. NuGet si occuperà della rimozione del
pacchetto selezionato togliendo i riferimenti dalle
References del progetto, eliminando i file
eventualmente aggiunti e ripristinando i file di configurazione. La
sottocartella con i file del pacchetto presente nella cartella
packages sarà parimenti rimossa.
Così come in automatico NuGet è stato in grado di installare i
pacchetti da cui quello selezionato dipendeva, così in fase di
rimozione possiamo chiedere a NuGet di rimuovere dal progetto anche
tali pacchetti aggiuntivi. Se ad esempio decidiamo di rimuovere il
pacchetto ELMAH, veniamo interrogati da NuGet sulla possibilità di
rimuovere anche i pacchetti da cui lo stesso dipende.

Tags: NuGet