Elm を書く環境を整える

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。齋藤です。

この記事は Elm アドベントカレンダー 11日目の記事です。

この記事では 以前書いた記事 をベースに Elm の環境をセットアップに関して整理してみます。

今回書く内容は以下の内容です。

  • elm のセットアップ
    • elm のインストール
    • vscode-elm のインストールと設定
  • elm-test のセットアップ
    • いくつか書いてみる
    • vscode-elm と elm-testのフォルダ構成で詰まった話
  • elm-format によるフォーマット
  • elm-analyse によるLint
    • なぜかLintされない話

elm のセットアップ

まずは elmを使う為には npm が必要です。 npm のセットアップをしたあと、elm を インストールしていきます。

npm init -y
npm install elm -D

ライブラリをインストールしてみましょう。

npx elm package install elm-lang/html -y

すると 以下のような、elm-package.json が 生成されると思います。

{
    "version": "1.0.0",
    "summary": "helpful summary of your project, less than 80 characters",
    "repository": "https://github.com/wreulicke/elm-sandbox.git",
    "license": "MIT",
    "source-directories": [
        "."
    ],
    "exposed-modules": [],
    "dependencies": {
        "elm-lang/core": "5.1.1 <= v < 6.0.0",
        "elm-lang/html": "2.0.0 <= v < 3.0.0"
    },
    "elm-version": "0.18.0 <= v < 0.19.0"
}

vscode-elm のインストールと設定

VSCodeのワークスペース設定に以下の内容を書き込みます。 絶対パスで記述している理由は後ほど記述します。

{
    "elm.makeCommand": "/Users/John.Doe/repo/elm-sandbox/node_modules/.bin/elm-make"
}

elm-test のセットアップ

まずは elm-testをインストールします。

npm install elm-test -D

次のコマンドでリポジトリでのテスト環境をセットアップ可能です。

npx elm-test init

以下のようなツリー構成になります。

├── Main.elm
├── elm-package.json
├── package-lock.json
├── package.json
└── tests
    ├── Example.elm
    └── elm-package.json

いくつか書いてみる

以下のような形でテストがかけます。 fuzz を使ったテストは [Elm] Fuzzer でテストデータを量産しよう を見るといいでしょう。 テストデータを自動で生成することができます。

module Example exposing (..)

import Expect exposing (Expectation)
import Fuzz exposing (Fuzzer, int, list, string)
import Test exposing (..)


suite : Test
suite =
    describe "first test"
        [ todo "test todo" 
        , test "my first case" <|
            \_ -> Expect.equal 2 2
        , fuzz string "test" <|
            \str ->
                case str of
                    "" ->
                        Expect.pass

                    " " ->
                        Expect.pass

                    _ ->
                        Expect.fail "sss"
        ]

vscode-elm と elm-testのフォルダ構成 で詰まった話

以前の記事でも書いたのですが、 開いているファイルから見て一番近い親にある elm-package.json をベースにelmの実行ファイルを検索するため、 以下の形で設定を記述していると動きません。

{
    "elm.makeCommand": "./node_modules/.bin/elm-make"
}

そのため、elm-test で作ったサブディレクトリのファイルではコンパイラが見つからず エディタの連携が動きません。

解決方法としては現状以下の2つです。

  1. PATHにelmを入れる
  2. ワークスペースにあるファイルを絶対パスで指定

将来的に elm 本体に test ライブラリが取り込まれ この問題は解決されるかもしれません。

elm-format の設定

elmにはelm-formatというフォーマッタがあります。 インストールして設定してみましょう。

npm i elm-format -D

VSCodeのワークスペース設定に以下の記述を追加すると良いです。

{
    "elm.formatCommand": "/Users/saito.masaya/repo/elm-sandbox/node_modules/.bin/elm-format",
    "elm.formatOnSave": true
}

次のコマンドでもフォーマットが可能です。

npx elm-format . --yes

elm-analyse のセットアップ

elmにはelm-analyseというLinterがあります。 インストールして設定してみましょう。

npm i elm-analyse -D

VSCodeのワークスペース設定に以下の記述を追加すると良いです。

{
    "elm.analyseCommand": "/Users/saito.masaya/repo/elm-sandbox/node_modules/.bin/elm-analyse",
    "elm.analyseEnabled": true
}

チェックしてくれる項目に関しては 同じアドベントカレンダーに記事があるので そちらを参照すると良いでしょう。

なぜかLintされない話

自分の環境ではなぜかLintされないケースがありました。

原因としては、ファイル名の先頭が小文字だったことです。 解決方法としてはファイル名の先頭を大文字にしましょう。 モジュール名と合わせるのが正解なのかな。

ちなみに、elm-formatでフォーマットしているはずのファイルで elm-analyseから Unformatted file と怒られるのは どうしてでしょうか・・・。

まとめ

今回は elmの環境のセットアップについて記事にしました。 いかがだったでしょうか。

個人的に詰まった内容を書いてみました。

明日は aiya000 さんによる 「How to make type classes without implicit caller in Elm」だそうです。 型クラスの話でしょうか?