haskell-jp / beginners #25 at 2024-06-02 13:35:58 +0900

早速相談したいことが出たので、質問させて下さい:bow:
stack new stack240529というコマンドで新規プロジェクトを作成したのですが、
新規作成したコードをVSCodeで開いたところ、
./app/Main.hsの3行目でimportエラーがでてしまっています。
こちらの件、何か解決方法とかあるのでしょうか?

参考までに`stack`と`hls`はghcupというツールを使ってインストールしました。
app/Main.hs はどんな内容で、具体的にどんなエラーメッセージが出ていますか?
すみません、画像を添付し忘れていました:man-bowing:

Could not find module 'Lib'
It is not a module in the current program, or in any known package.not found

と出ています。
Lib.hs と、 stack240529.cabal 、あるいは package.yaml というファイルが stack240529 フォルダーにあると思うので、それらの内容も見せてください。
Main.sh についてはもういいですが、なるべくこういう時はスクリーンショットではなく直接ソースコードをコピペして貼り付けて頂けたほうが見やすいです。
stack240529.cabalと`package.yaml`を共有致します。
今後質問する際はキャプチャではなくコードを貼り付けるようにします。

宜しくお願いいたします。
stack240529 ディレクトリーでターミナルを起動して、 stack build すると何が起こりますか?
stack build
の出力結果をお乗せします(一部、ソースの絶対パスが表示されている点がお見苦しくはございますが…:sweat:)
stack240529-0.1.0.0: unregistering (local file changes: src/Lib.hs)
stack240529> build (lib + exe)
Preprocessing library for stack240529-0.1.0.0..
Building library for stack240529-0.1.0.0..
[1 of 2] Compiling Lib [Source file changed]
Preprocessing executable 'stack240529-exe' for stack240529-0.1.0.0..
Building executable 'stack240529-exe' for stack240529-0.1.0.0..
[1 of 2] Compiling Main [Lib changed]
[3 of 3] Linking .stack-work/dist/x86_64-osx/ghc-9.6.5/build/stack240529-exe/stack240529-exe [Objects changed]
stack240529> copy/register
Installing library in /Users/k27c8/programming/haskell/trashes/stack240529/.stack-work/install/x86_64-osx/bd60a721f36c15ba72f8d53b5721206fd16e3350ae93c50f5546ebbc154023bd/9.6.5/lib/x86_64-osx-ghc-9.6.5/stack240529-0.1.0.0-9G2GUYl0sGoBeBlWIHWMjM
Installing executable stack240529-exe in /Users/k27c8/programming/haskell/trashes/stack240529/.stack-work/install/x86_64-osx/bd60a721f36c15ba72f8d53b5721206fd16e3350ae93c50f5546ebbc154023bd/9.6.5/bin
Registering library for stack240529-0.1.0.0..

なお`stack run`コマンドを実行したら、正常に動作するので、ビルドは正しく動いているようです:thinking_face:
まだ Main.hs で同様のエラーは出てますか?
はい、未だVSCodeでエラーが起きます。

buildは通るのですがVSCode上では赤字が表示されるというのが今回の気になるところ…:thinking_face:
うーん、単純にビルドができてないからだと思いましたが(私自身似たような経験があったので)、違う、と。分かりませんなぁ
もしかしたらバージョンの違いもありあすでしょうか:thinking_face:
皆様はどのバージョンを使っていますか?

ちなみに自分は
• ghc ・・・ 9.6.5
• stack ・・・ 2.13.1
• hls ・・・ 2.7.0.0
です。
stack path --compiler-binwhich ghc-9.6.5 (あるいはWindowsであれば gcm ghc-9.6.5 )したらどんな結果が返ってきますか?
:warning: こんなタイミングですがこれから外出するので少し返答遅れます。
こちらが結果になります
stack path --compiler-bin :
${HOME}/.stack/programs/x86_64-osx/ghc-9.6.5/bin

which ghc-9.6.5 :
${HOME}/.ghcup/bin/ghc-9.6.5
恐らく、ghcupがインストールしたGHC( PATH に入っている方のGHC)とstackがインストールしたGHC両方があるせいで混乱しちゃってますね(関連: https://docs.haskellstack.org/en/stable/Stack_and_VS_Code/ )。
VS CodeがGHCupのGHCを使おうとして、stackはstackのGHCを使おうとしているせいで結果が食い違っているのではないかと思います。
取りあえずの解決策としては、 stack path --global-config を実行するとstackの設定ファイルへのパスが出てくるので、そのファイルを編集して、
install-ghc: false
system-ghc: true

と付け加えてください。
無事にエラーが解消されました:sob::sob::sob:

正確には`~/.stack/config.yaml`を編集するだけでは直らなかったのですが、
以下の内容
cradle:
  stack:

の`hie.yaml` を追加することにより、解決しました(参考サイト→)。

大変ありがとうございました:man-bowing:
ghcup を使って環境をととのえるのがやりやすいと思います。ghcup tui で各種のツールのバージョンなどが見えますので、調整すると比較的楽にツールの調整ができます。
ただ、注意点があって、現時点では、stack new で stack.yaml に設定される resolver は、lts-22.24 で GHC 9.6.5 ですが、これがghcup で最初にインストールされる recommended つきの hls-2.7.0.0 ではサポートされません。
ghcup tui を使って hls-2.8.0.0に切り替えるとGHC 9.6.5 がサポートされるようになります。
また、タイミングによっては、hls の最新版あるいはrecommend版が、stackageの最新 lts がサポートするGHC のバージョンをサポートできていないことがありえます。その場合は、hlsを自分で調整してビルドするか、stack new をつかって作成したプロジェクトのstack.yamlのresolverを調整する必要があります。
(残念ながら、stackage にはまだ、9.10.1 のサポートがありません。9.10.1 をつかいたい場合は、stackではなくcabalを使う必要があります)

hie.yaml は hls を使うときに必要です。implicit-hie パッケージをインストールすると、.cabal ファイルから hie.yaml をよしなに生成してくれる gen-hie というコマンドがインストールされるので、それを使うのがお勧めです。以下のような感じで使っています。また、package.yaml を変更したときは、.cabalファイルを変更するために、stack build をやったあとに gen-hie > hie.yaml をやっておきます。
$ stack new hoge
$ cd hoge
$ gen-hie > hie.yaml
@nobsun さん、ご指摘大変ありがとうございます。
ただ、返信に気づくのが大変遅れてしまい、申し訳ありません:man-bowing:

アドバイスの内容は以下の通りでしょうか?
1. ghcupを使った方がよい
2. hls-2.7.0.0からhls-2.8.0.0に切り替えた方がよい
3. hie.yamlを作成する際はgen-hieというツールを使った方が良い
1.に関しましては、ghcupを使ってstackやhlsを入れていることは、
既にこのスレッドの最初で述べた通りです。
2.に関しましてですが、試しにhlsのバージョンを2.8.0.0に切り替えたのですが、
やはり同様のエラーが起きてしまいます。
なお、と同じようににhie.yamlファイルを書き加えたらエラーが消えました。
3.についてですが、gen-hieは`stack install`コマンドでinstall済みではありますが、実際には使っていなかったですね。。今後使うことにします。

以上、宜しくお願いいたします。
stack build では問題ないが、VS Code で赤い波線が出るのはHLSがらみだと思われます。
1. どの GHCのバージョンがどのHLSでサポートされているかを確認するには ghcup を使うのが楽。
2. GHC-9.6.5 で使うのであれば、hls-2.8.0.0 でないとHLSのサポートが受けられない
3. HLSのサポートを適切にうけるには hie.yaml を適切に設定する必要がある(適切なhlsのバージョンをインストールしただけでは上手くいかない)。適切な hie.yaml ためには、gen-hie を使うのが楽。
というのが意図でした。判りにくい説明で申し訳ありませんでした。以下の簡単な記事を書きました。御笑覧ください。
https://zenn.dev/nobsun/articles/progenv-with-ghcup-stack-hls
@てぴか さん、今更で申し訳ないのですが、本件最終的に hie.yaml を作成することで解決した、とありますが、 ~/.stack/config.yaml
install-ghc: false
system-ghc: true

を追記した時点で、エラーメッセージに何か変化があったか覚えていますか?

というのも、私が予想した「ghcupがインストールしたGHCとstackがインストールしたGHCが両方あるせいで発生した」のが本当なのか確認して、記事にしようと考えています。今手元で再現ケースを作ろうと試みているのですが、予想が外れて徒労に終わる前に、念のためてぴかさんの環境でどうだったかを教えていただきたいです。もちろん覚えていればで構いません!
@igrep さん、slackをあまり開かいものでして、
返信が遅れてしまい大変申し訳ありません:bow:

~/.stack/config.yaml を追加した時点では特に変化はありませんでした。
今手元で再現ケースを作ろうと試みているのですが、予想が外れて徒労に終わる前に、念のためてぴかさんの環境でどうだったかを教えていただきたいです。
現在、自分はmacbook airを使っているのですが、
この現象が自分の環境独自のものなのか気になったので、
dockerのalpine上でX Window経由でVS Codeを開いてみました。
そうしたら同様のエラーが起きました
(dockerでの環境構築、苦労しました…:sob: )

もしよろしければ、そのDockerfileを共有いたしましょうか?
おお、すみません、マジか!昨日自分のMacbook Airで調べた範囲では再現しなかったので、もうこの話は終わりにしようと思っていたのですが、そうなると少し気になります。
https://haskell-jp.slack.com/archives/CUPBC8WCE/p1719141192964919
少し待っててください、探してみます。。。
@てぴか あの、もし随分前に書いたDockerfileで、諸々のバージョンも古いとしたら、別にいいですよ。
:point_up: で引用した私の記録の通り、最新版ではどうやら発生しないであろうことは確認できているので。
@igrep
試しにもう一度Dockerで環境構築を行ったところ、やはり再現しました。
以下Dockerfileと手順を記載します。
1. VSCodeの本家サイト(→)からvscode本体をあらかじめダウンロードし、`Dockerfile`と同じ階層に置く
a. Linux版をダウンロードすること
b. 今回は**.deb版を使用します
2. `docker build . -t IMAGE_NAME`等のコマンドでDockerfileをビルドする
3. Macを使っている場合、XQuartzなどのツールでXサーバーを立ち上げておき、`xhost + localhost`のコマンドを叩く
4. 2.で作成したimageを`docker run -it --name MY_CONTAINER_NAME IMAGE_NAME bash`等のコマンドでコンテナを立ち上げる
5. ghcupをインストール
a. インストール方法は本家サイトを参照(→)
b. (余談)Dockerfileにghcupのインストールコマンドも入れたかったが、『HLSを入れますか?』などの質問がinteractiveに来てしまいdockerのbuildが止まってしまうので、こればかりは手動でコマンドしました…
6. ghcupコマンドでstackやhls等のツールを入れる
a. 一例ですが、自分は以下よう(recommended)にしました
▪︎ ghc: 9.4.8
▪︎ cabal: 3.10.3.0
▪︎ hls: 2.7.0.0
▪︎ stack: 2.15.5
▪︎ ghcup: 0.1.22.0
7. `~/.bashrc`をエディタ等で編集して`/root/.ghcup/bin`にパスを通す
8. `stack new XXXX`で新しいプロジェクトを作る
9. `code --no-sandbox --user-data-dir=/root/.vscode`でVSCodeを起動
10. 9.で立ち上げたvscode上で をインストール
11. 「File」→「Preferences」→「Settings」でエディタの設定を開き、「Extensions」→「Haskell」で「Manage HLS」の項目をGHCupに変更
12. vscodeで8. で作ったプロジェクトをvscode上で開く
a. その際に「○○をインストールしますか?」と出るので、素直に従う
13. `XXXX/app/Main.hs`のimportの部分で赤字が表示される
dockerのalpine上でX Window経由でVS Codeを開いてみました。
すみません、今見たらdebianでした:pleading_face:
了解です。調べるのは次回のHaskell-jpもくもく会の時になるかと思いますが、やってみます。
<@U075MF7TX8T> すみません、手元のWSL 2上のDocker上の環境で試しましたが、「全く同じ」と呼べるような状況は再現しませんでした。セットアップしていて気になったんですけど、該当のプロジェクトで *`stack build` が成功した上でVS Codeを再起動*した後も問題はなくなりませんでしたか?

というのも、該当のプロジェクトで `stack build` していない状態だと(発生した問題の違いこそあれ)、先週 macOS で実験した場合と今回試した場合いずれにおいても問題が発生したからです。

• macOSで実験した場合: てぴかさんと似た状況で「`XXXX/app/Main.hs`のimportの部分で赤字が表示される(ただしエラーメッセージはてぴかさんが最初にこのスレで報告した「Could not find module 'Lib' It is not a module in the current program, or in any known package.not found」ではなく「Cannot satisfy ...」で始まるものでした(正確なメッセージは忘れてしまいました。悪しからず)
• WSL 2 + Dockerで実験した場合: VS Codeの左下の箇所で「Processing: 1/3」といった内容が表示され続ける。クリックして詳細を確認すると「Source: Haskell」なる処理で固まっているらしきことがわかる
(すみません、前の発言を途中で送ってしまいました!)

いずれにしても、今回てぴかさんが最初に報告した問題とは別物ですし、私が懸念した「ghcupがインストールしたGHCとstackがインストールしたGHCが両方あるせいで発生する問題」とは無関係な、 stack build で解決できるもののではないかと思います。
@igrep
すみません、環境構築及び再現の試みなど、大変ありがとうございました。

なるほど…承知いたしました。

少なくとも、自分は「Cannot satisfy ...」というエラーは一度も確認したことがないですね。。
Dockerの上でも同様に`stack build`が成功した後も発生したと思います(少し確証がないので、後日確かめてた後にまた改めて報告致します)。

(仮想環境含め、自分のマシン上だけエラーが発生してしまうのも不思議ですね…:thinking_face:)
:bow: あー、すみません、あと大事なことを忘れてました。Dockerfileをいじっているのでそれも共有しておきます。修正したのは、基本的にGHCupを自動でインストールするためだったりimageのサイズを減らすためだったりなので、基本的にやってることは変わらないはずです。何か気になる点があったら教えてください
# To run GUI app on WSLg, you need to `docker run` with the following options:
# docker run -it --rm -v /tmp/.X11-unix:/tmp/.X11-unix -v /mnt/wslg:/mnt/wslg -e DISPLAY -e WAYLAND_DISPLAY -e XDG_RUNTIME_DIR -e PULSE_SERVER haskell-with-vs-code bash
# Ref. 

# And to run VS Code:
# code --no-sandbox --user-data-dir=/root/.vscode

FROM debian:bookworm-slim

RUN <<EOF
  set -eux
  apt-get update
  # GUI
  apt-get install -y ca-certificates libasound2 libatk-bridge2.0-0 libcairo2 curl libgtk-3-dev libgtk-4-dev libnss3 xdg-utils xserver-xorg x11-apps
  apt-get clean
EOF

RUN <<EOF
  set -eux
  mkdir /work
  cd /work

  # VS Code
  curl -L -o code_amd64.deb ""
  dpkg -i code_amd64.deb

  # GHCup and etc.
  apt-get install -y libgmp-dev libncurses-dev libncurses5
  apt-get clean
  curl --proto '=https' --tlsv1.2 -sSf  > get-ghcup.sh
  chmod +x get-ghcup.sh
  ## To install GHCup etc. automateically:
  export BOOTSTRAP_HASKELL_NONINTERACTIVE=1
  ### Align with the versions てぴか told me
  export BOOTSTRAP_HASKELL_GHC_VERSION=9.4.8
  export BOOTSTRAP_HASKELL_CABAL_VERSION=3.10.3.0
  export BOOTSTRAP_HASKELL_INSTALL_HLS=1
  export BOOTSTRAP_HASKELL_ADJUST_BASHRC=1
  export SHELL=/bin/bash # To update PATH by ghcup
  ./get-ghcup.sh
  rm -r /work
EOF
ENV DONT_PROMPT_WSL_INSTALL=1
WORKDIR /root
読みやすさのためにGistにも置きました https://gist.github.com/igrep/1ad92875509f5ef84fa73c9c3c1ad3b8
ありがとうございます!!!
ghcupは手動でインストールする、という不便さに困っていたのですが、
参考にさせて頂きます:astonished:
@igrep
すみません、あることに気づきました。
そういえば、vscodeではstackプロジェクトの一つ上の階層のフォルダを開いていました。
stack newで作成されたプロジェクトを直接VSCodeでひらけば、エラーが起きませんでした。

例: parentフォルダ以下で`stack new myproject`コマンドを実行したとすると、作成したプロジェクトを直接開いた場合はエラが起きない(一枚目の画像)けれども、親フォルダ(今回は`parent`フォルダ)からVSCoceを開くとエラー表示される(二枚目の画像)