要約
Haskellのcabal-install v3でNix-style build(v3ではこれがデフォルトのモード)をする場合、doctestを使うパッケージがあるなら以下の設定をcabal.projectや$HOME/.cabal/configに書いておくといい。
write-ghc-environment-files: ghc8.4.4+
参考
- HaskellやっていくGHC8.8.1令和元年白露の候 - syocy’s diary
- Cabal-3: doctest-discover fails for non-boot libraries · Issue #6087 · haskell/cabal
- 8. cabal.project Reference — Cabal 3.4.0.0 User's Guide
何が問題なのか
上記の設定を入れないと、doctestが外部パッケージのDBを参照できなくなり、ghcのコアパッケージ以外のパッケージを参照できなくなる。
例えばdoctestが処理するソースファイルに
import Data.Aeson (FromJSON)
などと書いてあるとdoctestがData.Aeson
を見つけられずにエラーになる。(.cabalのbuild-depends
にaesonを書いてもダメ。doctestは.cabalファイルを参照しないらしい)
これ以外にも、例えばCPPを使って外部パッケージのバージョンを参照しようとするとエラーになる。例えば、
{-# LANGUAGE CPP -}
...
#if MIN_VERSION_aeson(1,5,0)
...
#else
...
#endif
などと書くと、MIN_VERSION_aeson
を処理できずにエラーになる。
どう解決するか
write-ghc-environment-files
設定を有効にすると、ビルド時にプロジェクトディレクトリに.ghc.environment.{architecture}
といった名前のファイルが作られる。この中に参照すべきパッケージDBの場所が記録される。これがあればdoctestも外部パッケージを見つけられるようだ。