0.前置き

初めてAdvent Calenderに挑戦しています。
私の担当は、「PowerShell Advent Calendar 2011」の14日目です。
Webアプリケーション開発の効率化のためによくPowerShellを利用しますが、ブログで取り扱うのは初めてです。

今回のテーマは「psake」(日本の酒と同じ読み方)です。
psakeはPowerShellを使ったビルドツールです。
.NETの開発では、ビルドツールにMsBuildやNAntを利用することがありますが、psakeも同じ用途です。
では、さっそく。

1. psakeとは

psakeとは、PowerShellで書かれたビルドツールです。
アングルブラケット地獄に陥ることなく、PowerShellの機能をふんだんに使えるビルドスクリプトが書けます。
ソースコードと実行モジュールはGitHub上にホストされています。こちら。
NuGet経由で手に入れることも可能です。こちら。

2. 実際にビルドスクリプトを書いてみる

psakeで作るスクリプトは、タスクと、その依存関係を示すコードからなります。
例えばビルドをするスクリプト(タスクのことです)は以下のよう。
[sourcecode language=”powershell”]
task Build{
Write-Host -ForegroundColor Green "Building"
exec { msbuild Sample.csproj } "Error Building" | out-null
}
[/sourcecode]

コンポーネントテストをするスクリプトは以下のよう。
[sourcecode language=”powershell”]
task Test{
Write-Host -ForegroundColor Green "Testing"
exec { mstest /testcontainer:Sample.dll } "Error Testing" | out-null
}
[/sourcecode]

そして、これらの実行順序を考慮して、依存関係を示すスクリプトがこんな感じ。
[sourcecode language=”powershell”]
task Full -depends Build, Test
[/sourcecode]

タスクに相当するものとして、一時領域のクリーンアップや、ビルド、コンポーネントテスト、メトリクス取得、テストカバレッジ取得、配置パッケージ作成、などなどが考えられるでしょうか。

3. ビルドしてみる

では、実際にビルドしてみます。
上述したコードをbuild.ps1に格納していると仮定します。
[sourcecode language=”powershell”]
.\psake.ps1 -buildFile "build.ps1" -taskList "Full" -framework "4.0"
[/sourcecode]

psakeの本体は、psake.psm1ですが、いちいちモジュールを読み込むのは面倒だということで
あらかじめヘルパーとして、psake.ps1が用意されています。
普段利用するときは、psake.ps1経由が良いと思います。
引数として渡しているものは、

-buildFile タスクが記述されているPSファイル
-taskList 実行するタスク
-buildFile ビルドに利用する.NET Frameworkのバージョン(何も指定しないと3.5でビルドされる)

です。

GitHubに、ASP.NET Webフォームのサンプルアプリをビルドスクリプトをセットにした、お試しpsakeセットを置きました。
こちらをご参照ください。

4. おわりに

気になるpsakeの採用実績(?)ですが、ちょっと調べました。

プロジェクト名 概要 URL
AutoMapper 規約ベースのマッピングツール https://github.com/AutoMapper/AutoMapper
Soma ORマッパー http://soma.codeplex.com/
Json.NET .NETのJSONフレームワーク http://json.codeplex.com/
Glimpse クライアントからサーバーサイドをデバックできるツール https://github.com/Glimpse/Glimpse

今は自分が担当するプロジェクトにて、psakeで書いたビルドスクリプトをJenkinsに実行させています。
他のビルドツールと比較し、PowerShellで書けるpsakeのほうが管理しやすいです。
PowerShellの恩恵を受けられるのはやはり大きいです。
(PowerShell自体の機能が多いですし、Windowsに標準で入ってきますし。)

今日はこんなところです。
明日は、@RyosukeUemotoさんにバトンタッチです。