Questo post fa parte di una serie dedicata ad Aurelia e ASP.NET Core.
Prima di proseguire nel nostro cammino è opportuno aggiornare la versione di Aurelia che stiamo utilizzando per tener conto delle nuove feature e delle fix rilasciate nel frattempo dal team di sviluppo. È possibile che la vostra installazione di Aurelia sia già aggiornata all'ultima versione, a meno che non abbiate cominciato il viaggio in contemporanea con il mio primo post. In ogni caso questa procedura vi potrà essere utile in futuro.
Ci sono due cose che possiamo aggiornare: JSPM e i pacchetti Aurelia che abbiamo aggiunto al nostro progetto (aurelia-framework e aurelia-bootstrapper).
Come sappiamo abbiamo installato JSPM tramite NPM aggiungendo direttamente la referenza dentro il file package.json. Per aggiornarlo abbiamo ora diverse opzioni.
La cosa più semplice è tornare a sfruttare la buona integrazione di NPM in Visual Studio. Basta aprire il nodo Dependencies del nostro progetto e nella cartella npm cliccare con il tasto destro sul pacchetto jspm (che nel mio caso si trova alla versione 0.16.48). Dal menu contestuale possiamo quindi scegliere Update Package per avviare l'operazione di (eventuale) aggiornamento:
In realtà, pur essendo ad oggi disponibile la versione 0.16.52, se proviamo a lanciare l'aggiornamento non accade nulla e il progetto rimane alla versione 0.16.48. Ciò dipende dal modo in cui ho configurato JSPM all'interno del file package.json.
Per capire meglio, passiamo momentaneamente alla seconda opzione cui accennavo in precedenza… la famigerata "riga di comando". Come tutti i tool nati fuori dal mondo Microsoft, NPM dispone ovviamente di un'interfaccia a riga di comando che è la principale modalità di utilizzo dello strumento (un po' come per .NET Core che dispone di una sua CLI, dotnet, che viene poi wrappata da Visual Studio per svolgere le medesime funzionalità con una UI grafica).
Quando lo installiamo, Visual Studio provvede ad installare una sua istanza di Node (comprensiva ovviamente di NPM) nella cartella C:\Program Files (x86)\Microsoft Visual Studio 14.0\Web\External (almeno per Visual Studio 2015). Si tratta dell'istanza che viene utilizzata dalla IDE per svolgere in background le attività scatenate ad esempio dall'Update Package di cui abbiamo parlato sopra. Se infatti guardiamo nella sezione Bower/npm della finestra di Output possiamo vedere che l'operazione che abbiamo appena eseguito è stata trasformata in una chiamata al comando npm update jspm:
Per quanto sia possibile utilizzare quella stessa istanza per i nostri scopi, addentrandosi nello sviluppo web basato su Aurelia (o su altri framework simili) è bene installare Node (e quindi NPM) direttamente sulla propria macchina. Per farlo andiamo sul sito di Node e scarichiamo l'ultima LTS disponibile per il nostro sistema operativo (nel mio caso la 6.9.5 per Windows x64).
Dopo aver scaricato il file di setup, lanciamolo e seguiamo le semplici istruzioni fino ad arrivare al termine del processo. L'installazione provvede a registrare la cartella di installazione tra le PATH di sistema rendendo in questo modo possibile utilizzare NPM da qualunque prompt dei comandi:
Sfruttiamo subito questa possibilità andando ad installare JSPM in maniera "globale" sulla nostra macchina usando il comando npm install -g jspm e apriamo quindi un altro prompt dei comandi nella cartella del progetto, utilizzando ad esempio la comoda voce disponibile nel menu contestuale dei Productivity Power Tools:
Dal prompt digitiamo npm outdated:
Questo comando consente di verificare quali siano i pacchetti obsoleti presenti nella nostra applicazione. Nel nostro caso ci indica che il pacchetto jspm si trova attualmente alla versione 0.16.48 (Current) mentre l'ultima disponibile è la 0.16.52 (Latest). Ci dice però che il pacchetto che noi vogliamo è proprio il 0.16.48 (Wanted) e per questo motivo il comando di update non lo aggiorna anche se lo lanciamo da riga di comando:
Come dicevo, tale comportamento è dovuto al modo in cui ho referenziato JSPM al momento della sua installazione. Ci sono infatti diversi modi per configurare gli aggiornamenti dei pacchetti in NPM e i principali e più utilizzati sono tre:
- Una versione specifica: indicando uno specifico numero di versione (come ho fatto io scrivendo "jspm" : "0.16.48") istruiremo NPM ad utilizzare sempre e soltanto quella particolare versione (per questo motivo gli aggiornamenti che abbiamo tentato non sono andati a buon fine);
- Una versione con tutte le sue patch: indicando un numero di versione preceduto dalla tilde (~) istruiremo invece NPM ad utilizzare quella versione o una qualsiasi delle sue successive patch, ad esempio la 0.16.52 e più in generale la 0.16.y con y >= 48;
- Una versione con tutte le sue minor release: indicando un numero di versione preceduto dall'accento circonflesso (^) istruiremo infine NPM ad utilizzare quella versione o una qualsiasi delle sue successive minor release, ad esempio la 0.17.4 e più in generale la 0.x.y con x >= 16 e y qualsiasi.
NPM utilizza il semantic versioning per assegnare i numeri di versione ai pacchetti, quindi sia utilizzando la tilde che l'accento circonflesso ci garantiamo che nessun aggiornamento potrà portare delle "breaking changes" che possano determinare un disservizio della nostra applicazione (avremo modo di tornare su questo aspetto a breve).
Come dicevo queste tre opzioni sono così comuni che sono pienamente supportante dall'Intellisense in fase di modifica manuale del file package.json:
Modifichiamo quindi l'impostazione usando l'impostazione minor release ed eseguiamo nuovamente l'aggiornamento di JSPM.
Questa volta dovremo ritrovarci con la versione 0.16.52 installata.
Aggiornato JSPM è il momento di aggiornare Aurelia. In questo caso Visual Studio non ci supporta e dobbiamo quindi necessariamente andare a riga di comando. Apriamo nuovamente un prompt nella cartella del progetto e digitiamo jspm update:
JSPM ci notifica gli aggiornamenti che vengono fatti. Come possiamo vedere anche nel file config.json, dei due pacchetti solo aurelia-framework è stato aggiornato (dalla 1.0.7 alla 1.0.8) determinando un corrispettivo aggiornamento dei pacchetti ad esso collegati:
Anche in questo caso il comportamento di JSPM è dipeso dalle impostazioni che abbiamo indicato al momento dell'installazione (o per meglio dire in questo caso, che il tool Package Installer ha indicato per noi). In questo caso avevamo usato l'accento circonflesso, che ha determinato l'aggiornamento alla versione 1.0.8 di aurelia-framework e il mantenimento della versione 1.0.1 dell'aurelia-bootstrapper:
In effetti, se cerchiamo su NPM il pacchetto aurelia-bootstrapper, possiamo verificare che l'ultima versione disponibile è la 2.0.1 che ha quindi un numero di versione major differente:
Se cerchiamo direttamente su GitHub, possiamo verificare che l'ultima versione disponibile avente versione major 1 è proprio la 1.0.1 e per tale motivo JSPM non ha aggiornato questo pacchetto (che come detto in precedenza potrebbe avere delle breaking changes) come scelta conservativa per evitare malfunzionamenti alla nostra applicazione:
Per forzare l'aggiornamento del bootstrapper (cosa che non vi consiglio di fare, almeno fino al prossimo post) dobbiamo modificare il file package.json, ad esempio come segue:
Se eseguiamo nuovamente un jspm update avremo finalmente la nuova versione del bootstrapper installata nel progetto:
Se lanciamo nuovamente l'applicazione per verificare che tutto sia andato come previsto, ci accorgiamo purtroppo che la possibile breaking change di aurelia-bootstrapper ha avuto uno spiacevole impatto sul caricamento di uno dei moduli di Aurelia, l'aurelia-pal-browser. Come risultato l'applicazione non parte più e ci è chiarissimo il perché l'impostazione di base per regolare gli aggiornamenti sia quella con l'accento circonflesso che evita il passaggio automatico a major version successive:
Nel prossimo post cercheremo di capire cosa è successo e come rimediare all'inconveniente.
Happy coding!
posted @ lunedì 6 febbraio 2017 11:55