5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[haskell] stackとHaskell Language Server双方のご機嫌を取り続けた記録

Posted at

いくら開発側で便利なIDEやツールが用意されていても手元の環境一発であっさり壊れるんだなという実感があります。こんにちは。

今まで生の.hsファイルとかしか書いてなかったのを、stackを使ってわりとちゃんとしたパッケージの形で開発を始めて行った (行っている) のですが、ちょっと込み入ったことをやろうと思って実行した瞬間にコードと関係ない環境面で不具合が出まくったので、その戦いの記録を残しておきます。

具体的に何が起こったかというと、stackでのビルドは通るのにvscodeに入れていたプラグインくんが警告を出して止まるため、本当にチェックしたいものがチェックできないという事案が発生しました。

とはいえ、一番クリティカルな問題点はおそらく、ghc9.0.1にstackageのLTS haskellがまだ対応していないことが根源だろうとは思っています。なので、いろいろこねくり回すのをやめてStackage Nightlyをresolverに使うか、あるいはghc9.0.1をアンインストールして8.10.7を入れるかのどちらかにさっさと割り切ってしまうというのもひとつの手でしたね。

環境

2021年10月現在の私の環境ですが、以下のようになっています。

まあ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で開発しているなら、以下の内容でも動きます:

hie.yaml
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用の実行ファイルが導入されたことを「出力」タブで確認。
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?