🎸

M1Mac + Docker + VsCodeにおけるF#環境構築

2021/09/25に公開

まえがき

F#を学び始めて2日目の者です。

  • ちょっとだけ複雑な計算をしたい
  • AtCoderを関数型言語で解きたい(けどHaskellはしんどい)

という動機に対してF#がとても強力に思えたので、まずはこれを残します。

目的

F#環境をDocker+VsCode+RemoteContainerで構築する  
以下の状況を目指す

  • VsCode上でIntelliSense, Linter, SyntaxHilight, Formatterの恩恵を得ることができる
  • DockerImage以外のHostOSの環境を汚さない

留意事項

  • この記事はMacBookAir(M1, 2020)前提
  • Docker,VsCode のインストールは終わっている前提
  • この記事時点での環境はココを参照

Docker Image

.NET SDKイメージを使用する
fsharpイメージはdeprecatedなので注意

Docker Image 動作検証

以下のコマンドでPull&動作検証を行う

$ docker pull mcr.microsoft.com/dotnet/sdk:5.0
$ docker run --rm  mcr.microsoft.com/dotnet/sdk:5.0 sh -c " echo '\"hello world\"' | dotnet fsi"

Microsoft (R) F# Interactive version 11.4.2.0 for F# 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> val it : string = "hello world"

VsCode拡張機能

VsCodeにはデファクトスタンダード化したF#支援の拡張機能Ionide-fsharpがある
Atcoderを解く上で必要とされる機能は揃っている

.devcontainer

VsCodeのDevConterinerの設定を行う
作業ディレクトリのルートに.devcontainerディレクトリを作成し、devcontainer.json, docker-compose.ymlを配置する

ディレクトリ構成
$ tree -a
.
├── .devcontainer
│   ├── devcontainer.json
│   └── docker-compose.yml
└── main.fsx
docker-compose.yaml
version: "3"
services:
  workspace:
    image: "mcr.microsoft.com/dotnet/sdk:5.0"
    working_dir: "/src"
    volumes:
      - ../:/work
    tty: true
devcontainer.json
{
    "dockerComposeFile": "docker-compose.yml",
    "workspaceFolder": "/work",
    "service": "workspace",
    "extensions": [
        "Ionide.Ionide-fsharp"
    ],
    "settings": {
        "[fsharp]": {
            "editor.defaultFormatter": "Ionide.Ionide-fsharp"
        }
    }
}

devcontainer.jsonでは以下の設定を行なっている

  • 立ち上げるコンテナの基となるdocker-composeファイルのパス指定
  • VsCodeの作業ディレクトリの指定
  • DevContainerの対象となるdocker-compose service名
  • コンテナ立ち上げ時に、コンテナ上のVsCodeに拡張機能Ionide-fsharpをインストール
  • フォーマッターをIonide-fsharpに指定

.devcontainer 動作検証

  1. 作業ディレクトリでVsCode起動
$ ls -a
./             ../            .devcontainer/ main.fsx
$ code .
  1. 立ち上がったVsCodeのコマンドパレットで立ち上げ, "Remote-Containers: Open Folder in Container"を実行。指定するディレクトリはカレントディレクトリ
  2. DevContainer上で以下のエラーが出るが、xで消しておく(消さないとInide-fsharpが機能しない)
  3. 適当なコードを作成する
  4. フォーマッタを走らせ、整形されることを確認する
  5. コードを実行する。私から提示する方法は2種
    • 拡張機能経由での実行
      • コマンドパレットから"FSI: Send File"や"FSI: Send Line"などを用いてインタプリタを立ち上げ実行する
      • 逐次実行できてデバッグに便利
    • コマンドラインからの実行
      • dotnet fsi {filename} コマンドで実行する

参考

ここまでで、F#のコードを書くための環境を構築した。

参考サイト

 _____________________
/ 良質なドキュメントを含めて \
\ 開発環境             /
 --------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

見つけた便利なサイトを列挙する(逐次更新)

  • F# Core Library Documentation
    • CoreLibraryのドキュメント。 「List型のプロパティにこの機能あるっけ?」みたいなのを探すのに使用している
  • Midoliy|F#プログラミング
    • このサイトを使って勉強中。とてもシンプル&わかりやすくて、気に入っている(勝手にリンクしました。ごめんなさい)

環境

バージョン
macOS Big Sur 11.2.3
docker desktop 4.0.1
VisualStudioCode 1.60.2
.NET SDKイメージ 5.0
Ionide-fsharp v5.7.3
Remote-Containers v0.194.0

Discussion