編寫F#腳本一般使用.fsx文件和F# Interactive(Fsi)。對於需復用的腳本,Paket和Fake提供了處理各種用例的特性。Fake用於構造復雜的腳本,Paket則提供了依賴管理。
Fake
雖然Fake本身是一種構建工具,但是其構建目標(Target)體系也可用於編寫腳本。這是由於構建目標可用相互之間的關系定義,這同樣也是腳本的慣用寫法。使用Fake可以調用所有.Net庫。下面的代碼片段定義了運行FluentMigrator Migration的兩個Target:
open System.Management.Automation Target "BuildMigrations" (fun _ -> !! "src/app/**/migrations.csproj" |> MSBuildRelease buildDir "Build" ) Target "RunMigrations" (fun _ -> MigrateToLatest connectionString [assembly] options ) //定義依賴。 "BuildMigrations" ==> "RunMigrations"
腳本語言的一個理想特性是無需預先編譯即可運行代碼段。通過使用F# Interactive(Fsi),F#也可具有同樣功能,但這也意味著每台運行F#腳本的機器都必須安裝Fsi。與此不同,雖然Fake也實現了無需預先編譯即可運行腳本,但是不必在運行Fake的機器安裝F#編譯器。該功能源於Fake內直接植入了F#編譯器,這是由“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可以處理另外一種編寫腳本時的常見情況,即對獨立文件的引用。
// 引用NuGet包。 nuget FSharp.Management // 引用GitHub上的一個文件。 github myRepo/aProject dependency.dll
Paket還提供了組依賴功能,即當依賴僅限於子集時,無需取用全部軟件包。此功能非常適合於腳本,因為許多腳本可能使用同一個依賴文件。
//依賴共享。 nuget Newtonsoft.Json nuget FSharp.Core group Web nuget Fake.IIS nuget Suave group Database nuget FluentMigrator nuget SQLProvider
本文摘自“F# Advent Calendar”,它是F#社區首創的一個線上技術交流活動。
查看英文原文:Scripting in F# Using Fake and Paket