例によって 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 が一番賢い気がします.