Back To the Future: Windows Batch Scripting & ASP.NET vNext

Nell'ultimo TechEd è stata presentata l'anteprima della prossima versione di ASP.NET. La cosa davvero spettacolare è che, sin da subito, il codice è disponibile pubblicamente su GitHub (https://github.com/aspnet).

Per ogni informazione rimando all'ottimo articolo di Jon Galloway (http://weblogs.asp.net/jongalloway/a-30-minute-look-at-asp-net-vnext).

Studiando la materia mi sono imbattuto in un paio di file batch (.cmd) e sono dovuto tornare a scartabellare gli "antichi testi" per poterne comprendere il contenuto.

Per chi magari non si è mai imbattuto negli esoterismi del Windows Batch Scripting, qui di seguito spiego e interpreto il codice di un importante comando: KVM (K-Runtime Version Manager).

Come primissima cosa, una curiosità: Il motivo per cui la lettera "k" è onnipresente deriva dal fatto che inizialmente ASP.NET vNext si chiamava Project-K, da cui si ha:

  • Il Runtime, chiamato K-Runtime o KRE, di cui si possono avere contemporaneamente varie versioni, una per ogni istanza di applicazione.
  • Il Version Manager, chiamato KVM, che serve alla gestione dei diversi KRE disponibili. E' uno script PowerShell che viene lanciato da riga di comando tramite l'omonimo comando KVM.cmd.
  • Il Package Manager, chiamato KPM, che serve alla gestione dei NuGet Package. Chiama il Loader con appositi parametri tramite l'omonimo comando KPM.cmd.
  • Il Loader, chiamato KLR, è in grado di assolvere a molti compiti, tra i quali:
    • Installare/ripristinare i package.
    • Fare il bootstrap per l'esecuzione dell'applicazione.
    • Fare la Build dell'applicazione (cosa non strettamente necessaria per eseguire l'applicazione, che è una delle novità di ASP.NET vNext)

Per una maggiore comprensione delle varie componenti e di come queste interagiscono fra loro, vi invito a leggere la descrizione dettagliata della struttura e dell'architettura del K-Runtime, scritta da David Fowler: https://github.com/aspnet/Home/wiki/KRuntime-structure.

E' chiaro che molti di questi passaggi, ora che è uscita la CTP di Visual Studio 14, vengono automaticamente eseguiti tramite Visual Studio, ad esempio quando viene chiesta l'esecuzione dell'applicazione tramite il classico F5. Ciò non di meno, visto che siamo agli esordi di una nuova versione che per molti aspetti è radicalmente diversa da quella attuale, è importante capire cosa gira dietro le quinte. Anche perché uno degli obiettivi di ASP.NET vNext è quello di offrire una completa esperienza di sviluppo anche a riga di comando senza la necessità di usare Visual Studio (che rimane comunque lo strumento principe di sviluppo).

Fatte quindi le dovute premesse, passiamo dunque a parlare di Windows Batch Scripting, analizzando il contenuto di uno dei comandi che abbiamo a disposizione: KVM.cmd. La sua comprensione ci renderà poi facile analizzare autonomamente gli altri comandi.

KVM.cmd

E' il comando che lancia lo script PowerShell del Version Manager. Per chi eventualmente si domanda a che serve un comando che lancia uno script PowerShell, rispondo subito che il comando è indispensabile sia perché ingloba una serie di parametri di avvio necessari al corretto funzionamento di PowerShell (vedi ad esempio l'execution policy che per essere unrestricted deve necessariamente essere presente come parametro di avvio), sia perché alla fine dell'esecuzione dello script il comando si incarica di avviare un ulteriore comando, se presente, chiamato run-once.cmd.

Vediamolo nel dettaglio:

Nella riga 3 viene lanciato PowerShell con alcuni parametri di startup:

  • -NoProfile per evitare il caricamento del profilo utente.
  • -NoLogo per evitare la visualizzazione del banner di copyright di PowerShell.
  • -ExecutionPolicy unrestricted per abilitare lo script ad eseguire alcune funzioni che altrimenti sarebbero non autorizzate.
  • -Command che dichiara tre comandi da eseguire entro PowerShell, separati da punto e virgola:
    • [System.Threading.Thread]CurrentThread.CurrentCulture = ' '
    • [System.Threading.Thread]CurrentThread.CurrentUICulture = ' '
    • & '%~dp0kvm.ps1' %*

Per quanto riguarda i primi due comandi PowerShell, altro non fanno che impostare la CurrentCulture e la CurrentUICulture.

Per quanto invece riguarda il terzo comando, che a una prima lettura mi ha lasciato un po' perplesso e mi ha obbligato a ripassare i "sacri testi" di Windows Batch Scripting e PowerShell, abbiamo due elementi:

  1. & '%~dp0kvm.ps1'
  2. %*

Il primo elemento è evidentemente il nome dello script che PowerShell deve eseguire, visto che finisce per ps1. E' utile notare che, affinché PowerShell possa eseguire effettivamente uno script, devono essere soddisfatte le seguenti condizioni:

  • La Execution Policy consenta l'esecuzione di script (e in questo caso lo è poiché PowerShell viene per l'appunto lanciato in modalità unrestricted).
  • Lo script venga dichiarato comprensivo del percorso completo (drive:\dirPath\Filename.extension).
  • Se il percorso contiene degli spazi deve essere virgolettato e anteceduto dal Call Operator (&) affinché PowerShell interpreti l'elemento non come semplice stringa ma come percorso completo dello script da eseguire

Posto che all'interno di un comando %0 rappresenta il nome del comando stesso mentre %1 … %9 rappresentano gli argomenti passati al comando, la sequenza %~ seguita da una serie di opzioni (in questo caso pd) e terminata dal numero del parametro (in questo caso proprio il parametro 0) consente di estrapolare il path relativo al comando stesso.

Il secondo elemento è invece semplicemente il passaggio allo script PowerShell di tutti gli argomenti passati da riga di comando al lancio del comando kvm.cmd, in quanto %* è solo il modo abbreviato di scrivere %1 %2 %3 … %9

Vediamolo meglio in un caso esemplificativo, ipotizzando che la cartella che contiene il comando KVM.cmd e lo script kvm.ps1 sia "C:\Users\Nick\.kre\bin" e che tale path sia presente nella variabile di ambiente %PATH% e che venga eseguito (da una qualsiasi directory) il comando kvm list.

Allora & '%~dp0kvm.ps1' %* sarà pari a: 'C:\Users\Nick\.kre\bin\kvm.ps1' list

Al completamento dello script PowerShell (che durante la sua esecuzione potrebbe aver costruito un comando run-once.cmd), alle righe 5-7 tale comando, se esiste, viene eseguito e poi cancellato.

That's all folks, happy coding!

posted @ lunedì 16 giugno 2014 03:59

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011