Usare uno script Powershell come Post Build Event

Fino a poco fa mi è capitato di lavorare su un applicativo WPF che in base ai propri requisiti aveva la necessità di memorizzare le risorse grafiche e i file dei testi localizzati in una cartella diversa da quella di installazione.

In fase di sviluppo e testing però, avere una situazione del genere significa che dopo aver compilato occorre andare nella cartella Bin\Debug e copiare i file interessati nella cartella di destinazione (nel mio caso, una subfolder creata appositamente in %LocalAppData%).

Per tale motivo ho deciso di automatizzare la procedura utilizzando gli eventi di Post Build presenti nelle proprietà del progetto in Visual Studio 2013.

Ma partiamo con ordine. La prima cosa che ho creato è un semplice script Powershell che esegue le copie dei file interessati:

   1: param($ProjectDir)
   2: $TargertDir = $env:LOCALAPPDATA + "\Totem"
   3: $OrigineRisorse = $ProjectDir + "\Resources"
   4: $OrigineTemi = $ProjectDir + "\Themes"
   5: $DestRisorse = $TargertDir + "\Resources"
   6: $DestTemi = $TargertDir + "\Themes"
   7: $OrigineLang = $ProjectDir + "\Languages"
   8: $DestLang = $TargertDir + "\Languages"
   9:  
  10: Write-Output "Esecuzione azioni Post Build"
  11:  
  12: Write-Output "Pulizia delle cartelle nella destinazione in corso"
  13:  
  14: Remove-Item -Path $DestRisorse -Recurse -Force | where { Test-Path -Path $DestRisorse }
  15: Remove-Item -Path $DestTemi -Recurse -Force | where { Test-Path -Path $DestTemi }
  16: Remove-Item -Path $DestLang -Recurse -Force | where { Test-Path -Path $DestLang }
  17:  
  18: Write-Output "Avvio copia cartelle custom"
  19:  
  20: Move-Item -Path $OrigineRisorse -Destination $DestRisorse -Force
  21: Write-Output ($OrigineRisorse + " copiato in " + $DestRisorse)
  22:  
  23: Move-Item -Path $OrigineTemi -Destination $DestTemi -Force
  24: Write-Output ($OrigineTemi + " copiato in " + $DestTemi)
  25:  
  26: Move-Item -Path $OrigineLang -Destination $DestLang -Force
  27: Write-Output ($OrigineLang + " copiato in " + $DestLang)

Da notare è la prima riga di codice, param($ProjectDir), che non fa altro che recuperare un parametro passato in input allo script, e come si evince dal nome del parametro, si tratta della cartella dove risiede il nostro progetto. Dove aver impostato un po' di path, viene effettuata una pulizia delle cartelle di destinazione e poi la copia dei file aggiornati dalla cartella Bin alla cartella di destinazione. Una volta terminato lo script, l’ho salvato nella cartella dell’intera soluzione del progetto, e visto che mi trovavo, l’ho aggiunto alla soluzione stessa, in una cartella specifica in modo da avere anche lo script sotto TFS per il versionamento Smile.

image

Per richiamare questo script subito dopo aver compilato il progetto, possiamo utilizzare gli eventi di PostBuild. Li possiamo localizzare cliccando con il pulsante destro sul nome del progetto, poi “Proprietà”, e poi “Build Events”.

image

Da qui, selezioniamo il pulsante “Edit Post-build” e richiamiamo il nostro script Powershell con il seguente comando

image

Come notate, ho semplicemente richiamato l’eseguibile di Powershell e ho passato in input il file dello script e 1 argomento. In questo caso ho fatto uso delle macro (che potete trovare cliccando sul pulsante ‘Macros’), per recuperare le informazioni relative alla directory della soluzione e del progetto. E’ importante fare attenzione agli spazi nella costruzione di questi comandi, che potrebbero portare a comportamenti inaspettati e difficili da individuare. Sempre sulla pagina degli eventi ho lasciato selezionata l’esecuzione dello script solo quando la compilazione va a buon fine (On successful build).

Adesso ogni volta che compilate, in automatico le cartelle scelte saranno copiate all’interno della cartella di destinazione. Se volete verificare ogni passaggio eseguito dallo script, potete aggiungere un po' di Write-Output allo script e osservare l’Output Window in Visual Studio.

 

Keep Calm and Use Visual Studio! Hot smile

Comments are closed.