F#スクリプトでNuGetパッケージを使って爆速開発


はじめに

今まで C# では dotnet-script を利用すれば, NuGetパッケージ を使ったスクリプト開発ができました.
例えば 以下のようにすることで簡単に Json を扱う NuGetパッケージ を利用することができます.

Sample.csx
#r "nuget: Utf8Json"
using Utf8Json;

var str = "{ \"key\":100 }";
var json = JsonSerializer.Deserialize<dynamic>(str);
Console.WriteLine($"key= {json["key"]}");

今回 F# 5 で以下の構文が公式サポートされたというお話です.

#r "nuget: Utf8Json"

C#スクリプト があるんだし それでいいじゃん...
と思われるかもしれませんが C#スクリプト の場合はいろいろ準備しないといけないのでかなり不便です.

詳しくは この記事 を参照してください.

事前準備

.NET

この機能が入ったのが F# 5 preview 1 からなので, 必然的に .NET 5 以降 が必要になります.

そのため 公式ページ から最新の .NET をインストールするようにしてください.

※2020/05/07現在, 5.0.100-preview.3.20216.6 が最新

VSCode

テキストエディタは何でもよいのですが, 最近だと VSCode がよく利用されると思いますので以下に必要な設定を書いておきます.

今回は F# 開発を VSCode でやる場合に最低限必要な拡張機能を紹介しておきます.

シンタックスハイライトやコード補完, インテリセンスなどが不要な方はインストールしなくても問題ありません.

C# 拡張

Ionide-fsharp が依存しているので導入必須です.

Ionide-fsharp 拡張

シンタックスハイライトやコード補完などの各種機能を提供してくれている拡張機能です.

settings.json

インストールが完了したら VSCode の設定ファイルを編集して, Ionide-fsharp.NET Core/5F# 5 preview を使うように設定します.

settings.json
{
    "FSharp.fsacRuntime": "netcore",
    "FSharp.fsiExtraParameters": [
        "--langversion:preview"
    ]
}

なお, F# 5 が正式リリースされたあとについては, --langversion:preview が不要になります.

利用方法

VSCodeの場合

まず, 適当な場所に .fsx ファイルを作成します.

powershell
mkdir "D:/src/sandbox"
new-item "D:/src/sandbox/main.fsx"

今回, 私は D:/src/sandbox/main.fsx というファイル名で作成しましたが, 好きな場所に好きな名称で作成していただいてかまいません.

次に VSCodemain.fsx を開きます.

powershell
code -n "D:/src/sandbox/main.fsx"

そうしたら以下のように記述して, 一度 VSCode を閉じてから再度 "D:/src/sandbox/main.fsx" を開きなおします.

main.fsx
#r "nuget: Utf8Json"

再度開きなおすことで NuGetパッケージ のインテリセンスが有効になります.

コードを以下のように修正します.
F# には dynamic がないので, ちゃんと型を作成してあげます.

main.fsx
#r "nuget: Utf8Json"

open Utf8Json

type Foo = { Key:int }

"{ \"Key\":100 }"
|> JsonSerializer.Deserialize<Foo>
|> fun x -> printfn "Key= %d" x.Key

あとは実行ボタンを押せば, 実行されます

dotnetコマンドを直接利用する場合

まず, コードを以下のようにします.

main.fsx
#r "nuget: Utf8Json"

open Utf8Json

type Foo = { Key:int }

"{ \"Key\":100 }"
|> JsonSerializer.Deserialize<Foo>
|> fun x -> printfn "Key= %d" x.Key

dotnet fsi--langversion:preview を指定して, 実行します.

powershell
dotnet fsi --langversion:preview main.fsx

おわりに

控えめに言って 最高 ですね!!