haskell-jp / questions #105 at 2023-12-27 12:53:23 +0900

stack ベースのhaskell 環境で単体テストに HSpec を使用しています。
テストディレクトリ/Spec.hs に以下を指定していますが、haskell language server 経由で出るGHCエラー(下記)を消す方法がわかりません。
ご存知でしたら教えてください。

補足
コマンド行からの stack test 実行では問題ありません。
stack がインストールした hspec-discover の場所を haskell language server 設定のどこかで指定する必要があると推測しています。

エラー:
Spec.hs 1 1 error could not execute: hspec-discover (lsp)
Spec.hs:
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
Hiromi ISHII / mr_konn
ご推察の通りで、パスの通ったところにhspec-discoverがいないのが原因ですね。build-toolsに入れるだけだとstackやcabalは.stack-workとかdist-newstyleにしか入れないので、PATH環境変数を適切に設定した上で別途 stack install hspec などしてグローバルにインストールする必要があります
cabalファイルの build-tool-dependshspec-discover を入れたらできませんかね?
返信有り難うございます。
ご回答の通りPATHの通った場所 ~/.local/bin/へ hspec-discover をインストールし、解決いたしました。
ありがとうございました。
stack install hspec-discover
cabal ファイルは package.yaml から自動生成される(?)ようなので、package.yaml へ以下を追加してみましたが、解決しませんでした。
  :
tests:
  Spec:
    main:                Spec.hs
    source-dirs:         spec
    build-tools: hspec-discover
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - jsonclient
    - hspec
Hiromi ISHII / mr_konn
stackはbuild-toolsをグローバルにインストールしないんですよね
Hiromi ISHII / mr_konn
ちなみにHLS+stack+build-toolsでdiscover系のプリプロセッサが見つかってくれないのは既知のバグであったりします https://github.com/haskell/haskell-language-server/issues/176
Hiromi ISHII / mr_konn
あとpackage.yamlの書式としては

build-tools:
- hspec-discover:hspec-discover

とリストで指定するのが正しいかも?(コロン以降はなくても平気ですが
build-toolsじゃなくて build-tool-depends です。
konnさんのやり方でも解決できるでしょうし、実際に解決できてよかったですし、今から試すのも面倒だと思うので参考までに。
知る限りこちらがcabal的には正式なやり方のはずです。
https://cabal.readthedocs.io/en/3.4/cabal-package.html#pkg-field-build-tool-depends
Hiromi ISHII / mr_konn
package.yaml の build-tool-depends に相当する項目は build-tools ですので、 @さんの対処法は(stack+build-toolsでは解決しないという点を除けば)完全に正当なものでは?

https://github.com/sol/hpack#common-fields
おお、なるほどすみません。package.yamlが build-tool-depends も吐いてたんですね... なんと紛らわしい....
@igrep package.yaml では build-toolsを使用するみたいです。`build-tool-depends`だと以下のエラーが出ました。
jsonclient/package.yaml: $.tests.Spec.build-tool-depends is deprecated, use $.tests.Spec.build-tools instead

ご指摘の通り、cabal ファイルでは`build-tool-depends` として生成されました。まぎわらしいですね。