wtorek, 7 czerwca 2011

Konsola zarządzania

Jakiś czas temu stwierdziłem, że w projektach jakie wykonuję brakuje mi takiego jednego centralnego czegoś... Konsoli w której szybko i bez problemu mógłbym wykonać przewidziane wcześniej zadania takie jak:
  • Czyszczenie folderów projektu (Clean z VS jest mało rzetelne)
  • Kompilację (F5 czasem przestaje wystarczać)
  • Odpalania testów jednostkowych
  • Operacje względem repozytorium
  • Dowolna manipulacji plikami źródłowymi
  • Dowolna manipulacji plikami wynikowymi
Z pomocą przyszedł skrypt psake (repo) działający w powershell. Wspiera on automatyzację procesu budowania aplikacji używając zdefiniowanych przez użytkownika zależnych od siebie zadań. To znaczy, że jeżeli zadanie B zależy od A to wywołując B wcześniej odpalone zostanie A. Niby prosta rzecz, ale nad wyraz przydatna. Prosty plik ze skryptami wyglądać mniej więcej tak:
properties {
 $base_dir = resolve-path .
 $sln_file = "$base_dir\Revis.Examples.ManagementConsole.sln"
 $build_dir = "$base_dir\Build"
}

$line = new-object System.String('-', 119)

formatTaskName {
 param($taskName)
 write-host $line
 write-host ' '$taskName.ToUpper() -foregroundcolor yellow
 write-host $line
}

task default -depends ?

task clean {
 remove-item -force -recurse $build_dir -erroraction silentlycontinue
}

task init -depends clean { 
 new-item $build_dir -itemtype directory
}

task debug -depends init {
 exec { msbuild $sln_file "/nologo" "/p:outdir=$build_dir\" "/v:minimal" "/p:configuration=debug" }
}

task release -depends init {
 exec { msbuild $sln_file "/nologo" "/p:outdir=$build_dir\" "/v:minimal" "/p:configuration=release" }
}

task run -depends release {
 invoke-item "$build_dir\Revis.Examples.ManagementConsole.exe"
}

task ? {
 Write-Documentation 
}
Składa się z:
  • sekcji properties przechowującej istotne dla całości zmienne
  • formatowania dla nagłówków informujących jakie zadanie jest właśnie wykonywane
  • określenia zadania domyślnego
  • zadania "clean" usuwającego docelowy katalog kompilacji
  • zadania "init" przygotowującego foldery pod kompilację (zależne od "clean")
  • zadania "debug" budującego projekt w trybie debug (zależne od "init")
  • zadania "release" budującego projekt w trybie release (zależne od "init")
  • zadania "run" uruchamiającego projekt (zależne od "release")
  • zadania "?" prezentującego na konsoli wszystkie zdefiniowane zadania wraz z zależnościami.
W ramach własnej wygody do głównego katalogu projektu dodałem jeszcze mały skrypt bat. Po dwukliku uruchomia on konsolę powershell z spersonalizowaną nazwą, rozmiarem i kolorami, a co najważniejsze z wczytanym modułem psake.
@echo off
powershell -NoLogo -NoExit -ExecutionPolicy RemoteSigned -NoProfile -Command "&{"^

Import-Module .\Extenal\Psake\psake.psm1;^

$projectName = 'ProjectName'; ^
$width = 120; ^

$line = New-Object System.String('=',$width);^

$ui = (Get-Host).UI.RawUI; ^
$ui.WindowTitle = $projectName+' Management Console'; ^
$ui.ForegroundColor = 'White'; ^
$ui.BackgroundColor = 'Black'; ^

$bs = $ui.BufferSize; ^
$bs.Width = $width; ^
$bs.Height = 3000; ^
$ui.BufferSize = $bs; ^

$ws = $ui.WindowSize; ^
$ws.Width = $width; ^
$ws.Height = 50; ^
$ui.WindowSize = $ws; ^

Clear-Host; ^

Write-Host $line; ^
Write-Host `t$projectName' management console'`n ; ^
Write-Host $line; ^

Invoke-Psake ?; ^
}
Na koniec pozostaje już tylko w tak przygotowanej konsoli odpalić zadanie "run":
invoke-psake run
I cieszyć się efektami. Tradycyjnie dołączam plik z przykładem:

1 komentarz: