🎸
M1Mac + Docker + VsCodeにおけるF#環境構築
まえがき
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 動作検証
- 作業ディレクトリでVsCode起動
$ ls -a
./ ../ .devcontainer/ main.fsx
$ code .
- 立ち上がったVsCodeのコマンドパレットで立ち上げ, "Remote-Containers: Open Folder in Container"を実行。指定するディレクトリはカレントディレクトリ
- DevContainer上で以下のエラーが出るが、xで消しておく(消さないとInide-fsharpが機能しない)
- 適当なコードを作成する
- フォーマッタを走らせ、整形されることを確認する
- コードを実行する。私から提示する方法は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