いくら開発側で便利なIDEやツールが用意されていても手元の環境一発であっさり壊れるんだなという実感があります。こんにちは。
今まで生の.hsファイルとかしか書いてなかったのを、stackを使ってわりとちゃんとしたパッケージの形で開発を始めて行った (行っている) のですが、ちょっと込み入ったことをやろうと思って実行した瞬間にコードと関係ない環境面で不具合が出まくったので、その戦いの記録を残しておきます。
具体的に何が起こったかというと、stackでのビルドは通るのにvscodeに入れていたプラグインくんが警告を出して止まるため、本当にチェックしたいものがチェックできないという事案が発生しました。
とはいえ、一番クリティカルな問題点はおそらく、ghc9.0.1にstackageのLTS haskellがまだ対応していないことが根源だろうとは思っています。なので、いろいろこねくり回すのをやめてStackage Nightlyをresolverに使うか、あるいはghc9.0.1をアンインストールして8.10.7を入れるかのどちらかにさっさと割り切ってしまうというのもひとつの手でしたね。
環境
2021年10月現在の私の環境ですが、以下のようになっています。
- OS: Windows 10
- ghc, cabal, stack: Chocolatey経由で導入
- エディタ: VSCode
- プラグイン: Haskell for Visual Studio Code・Haskell Syntax Highlighting
まあWin10+VSCodeでhaskellをやろうと思ったらこうなるんじゃないでしょうか。
"Could not find module"
ちゃんとstack.yamlやpackage.yamlを書けていれば、stackはビルド時に依存するパッケージを自動で導入してくれるのですが、例えstackでのビルドが通ったとしても、HLSで通ってくれるとは限りません。なんでや。
ghcおよびcabalを別途インストールしていた場合、どうもHLSはそちらのパスを見に行くようで、そちらでインストールされていないパッケージはHLSにとって無いものと見なされます。
結果として、Could not find module
で始まるエラーメッセージをはいてくれやがります。
対策としては、cabal install --user <package>
あるいはcabal install --global <package>
をしてやります。これでHLS側の認識でも対象のパッケージがインストールされた扱いになります。
hie.yamlを書くとむしろエラー
HLSは内部でhie-biosを使っており、これを使ってghcに渡すべきフラグの管理等を把握します。これはふつう自動で行われますが、hie.yamlというファイルを書くことで明示的にhie-biosの設定を行うことができます。
とりあえず、例えばstackで開発しているなら、以下の内容でも動きます:
cradle:
stack:
ただし、stack側でresolverにlts-18.13 (ghc-8.10.7) などを使っている場合、「ghcideのバージョンは9.0.1でこのプロジェクトで使っているのは8.10.7だから、バージョンを揃えて!」とHLSに怒られます。こちとらghcideを導入した記憶がありませんが。
このエラーはhie.yamlを書かなければ起こりません。なら書かなければ問題ないな!(フラグ
どうしてもhie.yamlが必要になったら
hie.yamlは単純な構成のプロジェクトならわざわざ書く必要がありませんが、単純でない構成になってしまった瞬間に必要が出てきます。例えばプロジェクト内にパッケージを複数用意することになった場合などです。
このような場合、HLS (hie-bios) くんがMulti Cradle: No prefixes matched
というエラーを吐いてきます。
こうなったらhie.yamlを書かないといけません。hie.yamlを書かなければいけないということは、ghcideとghcのバージョンを揃えないといけません。
今回はghc-9.0.1をアンインストールしてghc-8.10.7を導入することで解決させました。(もちろんサポートされていればですが) 過去のバージョンも導入できるし複数バージョン導入可能なChocolateyつよいですね。
手順:
- ghc, cabal, stack, VSCodeのHaskellプラグインを全てアンインストール
- ghc-8.10.7をインストール (chocolatey経由の場合自動的にcabalもインストール)
> chocolatey install ghc --version 8.10.7 -my
- stackを再インストール
- VSCodeのHaskellプラグインを再インストール、ghc8.10.7用の実行ファイルが導入されたことを「出力」タブで確認。