例によって stack と ghc-mod

More than 3 years have passed since last update.

例によって stack と ghc-mod がうまくいかなかった顛末とこの場合の直し方.

tl;dr:



  • stack ghc のバージョンと ghc-mod をビルドした ghc が食い違ってたのが原因

  • 自分で git clone したやつからビルドするなら,stack.yaml をちょっと書き換えるのが楽かなあ

  • はなから clone とかせずに stack install ghc-mod を試しておくべきだった

環境: ghc-mod の 5.5.0.0 を自分で git clone -> cabal でインストールして使っていた.今回扱っているプロジェクトは stack で管理してみようと考えている.システムの ghc (エイリアスなしの which ghc) は /usr/local/ghc-7.10/bin/ghc にある ghc-7.10.2 で,これは 複数のGHCを共存させる - あどけない話 を参考にして入れたものだ.


どう動いていないか

普段 ghcmod-vim を使ってて,これが黙って動かない(補完候補を出してくれないことによって知られる)ことがたまにある.今回もこれで気付いて,stack 慣れてないこともあって色々時間を無駄にした後

$ ghc-mod check app/Main.hs

ghc-mod: <command line>: cannot satisfy -package-id network-2.6.2.1-25f4f3b167c1b84622324351cf72302e:
network-2.6.2.1-25f4f3b167c1b84622324351cf72302e is unusable due to missing or recursive dependencies:
base-4.8.2.0-0d6d1084fbc041e1cded9228e80e264d bytestring-0.10.6.0-9a873bcf33d6ce2fd2698ce69e2c1c66 unix-2.7.1.0-bb54ee8f9f6b2600aae7a748eb88a610

なんだ……これは……と思って調べるとどうやら wiki にそのまま載っている:


Same root cause as above: readPackageDb: inappropriate type.


これを見に行くとつまり

$ ghc-mod --version

ghc-mod version 5.5.0.0 compiled by GHC 7.10.2
$ stack ghc -- --version
The Glorious Glasgow Haskell Compilation System, version 7.10.3

この2つが食い違ってるのが死の原因で,ghc-mod をそれに合わせてビルドしてね,ということらしい.


git clone した ghc-mod を stack をつかって ghc-7.10.3 でビルド

ghc-mod は現時点での最新リリースであるv5.5.0.0 の段階では resolver としてlts-3.2使っていて, これはつまり ghc-7.10.2 だ.この辺を揃えるにはいろんな手があろうがもういい加減疲れていたので,まあ行けるやろってことで stack.yaml を書きかえた:

こう

--- a/stack.yaml

+++ b/stack.yaml
@@ -2,5 +2,5 @@ flags: {}
packages:
- '.'
extra-deps:
-- cabal-helper-0.6.2.0
-resolver: lts-3.20
+- cabal-helper-0.6.3.0
+resolver: lts-6.2

cabal-helper も書き換えたのは,

cabal-helper: needed (<0.7 && >=0.6.3.0), 0.6.2.0 found (latest applicable is 0.6.3.1)

こういう感じの怒られ方をした(needed のほうが resolver の要求するバージョン,というのが直観と逆向きでここでも時間を無駄にした)ので.これは issue も立っている.がいい加減いちいち更新するのダルいどうせ stackage にあるんだからそっちでインストールできるし,開発者は自分で適当にできるしそもそも stack.yaml 要らん気がするというような話になりかけてるっぽい.

閑話休題.これでソースのあるディレクトリで stack build すると

$ which ghc-mod

/home/lesguillemets/.local/bin/ghc-mod
$ ghc-mod --version
ghc-mod version 5.5.0.0 compiled by GHC 7.10.3

でめでたしと相成る.が,とりあえず cabal の頃のアレを忘れて clone せずに stack install が一番賢い気がします.