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:
Super wpis. Oby więcej takich. Pozdrawiam :)
OdpowiedzUsuń