Runner in the High

技術のことをかくこころみ

shelm: 脱法Elmパッケージマネージャー

elm/core などのカーネルモジュールにバグがあるとき、公式のバグ修正を待っていられないことがある。物によってはアプリケーションの動作に大きな影響があったりして早急な修正が必要になる場合もある。

そのような場合にはshelmを使うことで、自分たちで野良フィックスを取り込んだカスタムの elm/core が使えるようになる。

github.com

原理としてはelm-git-installと近い。

Elmアプリケーションのビルド時に使用されるelm-stuff配下のデータを先に作ってしまい、キャッシュされていることにしてpackage.elm-lang.orgからダウンロードできるものと置き換えている。

使い方

例えば、カーネルモジュールであるelm/timeを自分たちでカスタムしたもので置き換えたい場合には、次のようにlocationsフィールドをelm.jsonの中に新しく作り、オーバーライドする手段を指定する。

"dependencies": {
    "direct": {
        ...
        "elm/time": "1.0.0"
    },
    "locations": {
        "elm/time": {
            "method": "github",
            "name": "IzumiSy/elm-time"
        }
    }
}

methodのセクションにはgithubだけではなくfileも指定できる。

    ...
    "locations": {
        "elm/time": {
            "method": "file",
            "name": "../my-pkg/time"
        }
    }

あとはshelmでfetchを叩くことでelm-stuff配下にローカルパッケージのキャッシュデータを作らせることができる。

$ ./shelm fetch

あとはいつもどおりelm makeすればよい。

ほかにもいくつか機能があるが、それに関してはREADMEを読むか実際のコードを読むことで理解できると思う。shelm自体は1ファイルのシンプルなシェルスクリプトであるため、とくに複雑なものでもない。

余談: shelmはなぜ脱法か

このshelmの存在は、ElmlangのSlackワークスペースで「カーネルパッケージにあるバグを一時的に治したい場合にはどうすればよいか」という質問への回答として得られたものであるが、基本的にはElmのコミュニティにおいては脱法である。

shelmのREADMEにも"Note: Best not talk about this on the offical Elm channels unless you're trolling."(Elmの公式チャンネルでshelmについて話さないこと)と書かれていることからもそれが分かる。

Elmのカーネルモジュールにはポートを使わずにJSとのデータをやりとりできる基盤が存在しているため、容易に実行時例外を発生させるコードを書くことができてしまう。しかし公式はElmのことを「実行時エラーの存在しないAltJSである」と謳っていることから、カーネルモジュールに対する機能追加には非常に慎重である。また、Elmを使う人達の体験を損なわないためにも、shelmのようなElmの概念を揺るがす存在には厳しく目を光らせている。

いずれにせよ、実行時エラーのない言語としてElmを使うのであれば、自己責任のうえでshelmの利用は如何ともし難いカーネルモジュールのバグ修正程度に留めるべきだ。