F#のスクリプトは通常,.fsxファイルとF# Interactive (Fsi)を使って行なう。再利用されるスクリプトは,PaketとFakeを使うことで,さまざまなユースケースに対応する機能が利用できる。Fakeは複雑なスクリプトを構築するために使用し,Paketは依存性管理を行なう。
Fake
Fakeは,コアとしてはビルドツールだが,そのターゲットシステムをスクリプトの構築に用いることも可能だ。ターゲットは,スクリプトでは一般的なように,相互の関連で定義することができる。Fakeを使うことで,任意の.Netライブラリの使用も可能になる。次のスニペットは,FluentMigratorマイグレーションを実行する2つのターゲットの定義を示している。
open System.Management.Automation
Target "BuildMigrations" (fun _ ->
!! "src/app/**/migrations.csproj"
|> MSBuildRelease buildDir "Build"
)
Target "RunMigrations" (fun _ ->
MigrateToLatest connectionString [assembly] options
)
// Dependencies
"BuildMigrations"
==> "RunMigrations"
スクリプト言語に望まれるのは,コンパイルなしで小さなスニペットコードを実行できる能力だ。F#はこの要件をF# Interactive(Fsi)によって満たしているが,スクリプトを実行するすべてのマシンにFsiをインストールしなければならないという意味でもある。一方Fakeでは,事前のコンパイルなしでスクリプトを実行することができる。実行するマシン上にF#コンパイラは必要ない。この機能は,Fakeにコンパイラを直接埋め込むという,F# Compiler Servicesプロジェクトの成果を利用したものだ。
FakeからPowershellスクリプトを実行することや,必要ならばF#とPowershellを組み合わせることも可能だ。
open System.Management.Automation
Target "Powershell" (fun _ ->
PowerShell.Create()
.AddScript("& 'configure-server.ps1'")
.AddParameter("Verbose", "")
.Invoke())
Paket
ある種のスクリプト,特に外部サービスを扱うスクリプトでは,追加ライブラリが必要となる。スクリプトではあまり一般的ではないが,パッケージマネージャを使った依存関係の管理も可能だ。Paketを使うことで,スクリプトで一般的なもうひとつのケースとして,個々のファイルを参照することが可能になる。
// Reference a nuget package
nuget FSharp.Management
// Reference a single file from GitHub
github myRepo/aProject dependency.dll
Paketは依存性をグループ化する機能も備えているため,サブセットのみが必要な場合には,すべてのパッケージをフェッチする必要はない。いくつかのスクリプトが同じ依存ファイルを使用する場合があるので,この機能はスクリプトに適していると言える。
// Shared dependencies
nuget Newtonsoft.Json
nuget FSharp.Core
group Web
nuget Fake.IIS
nuget Suave
group Database
nuget FluentMigrator
nuget SQLProvider
この記事は,F#コミュニティが進めているF# Advent Calendarからの抜粋である。
この記事を評価
- 編集者評
- 編集長アクション