Haskellの環境構築
これがダントツで簡単かもmrsekut.icon
関連
環境構築しないでHaskellする
問題を切り分けよう
単純にHaskellのプロジェクトを作ること自体はそこまで大変ではない
ただ、選択肢が多くてどれを選べばよいのかわからない問題はある
難があるのはHLSを動かすこと
つまり、エディタの補完とかがない状態ならすぐに作れる
登場人物が多い
GHCup
Stack
HLS
cabal
GHC
Stackage
nix
devbox
etc.
そのため、組み合わせが多い
NixでGHC等を入れるのは簡単
projectごとに入れられる
GHCupでもGHC等を入れるのは簡単
ただしglobalに入っちゃう
Nixで入れても、GHCupで入れても連携がうまく行ってない
VSCode、HLS周りとGHC周りの連携をどうにかしたい
ここがちゃんとできるようになればほぼ全部解決する
https://gyazo.com/0bc6a308d669b993fea3eab66da062f5
要素が多すぎるねmrsekut.icon
GHCup, Stack, HLS, cabal, GHC, Stackage
どれを基準に、合わせていけばよいのかわからない
GPT-4.iconに聞いたのでそれをやっていく
現在は、lts-22.3っぽかったのでこれをstack.ymlに書く
code:stack.yml
resolver: lts-22.3
その後、それに合うGHCを入れる
ghc 9.6.3がそれらしい
プロジェクトの依存関係のinstall
$ stack build
HLSの設定
ghcupを使って入れる
リリースページに対応しているGHCのバージョンが書かれている
$ ghcup install hls
これで自動的に良い感じのバージョンを選んで入れてくれるらしい
VSCode Haskellはこの辺を適切なversionで自動でdownloadするので自分で入れる必要はない ref hie
hie-wrapper
hie-bios
haskell-language-server-wrapper
haskell-language-server
ghcide
いつの記事かわからんけど、これを試してみる
これpart3まであって長い
今のmrsekut.iconの環境にはすでにglobalにstackなどが入っており、VSCodeもhieで正常に動くけど、まあやってみるかという感じである
Pinning your haskell packages
release.nixを作ろうとしているわけだが、その過程でnixpkgsの固定をしている
そのため、.jsonとかpkgs-from-json.nixのようなfileを作っている
Setting GHC version
「必要なGHCを持つhaskellPackages」を持つnix channelを最初に指定するのが良い
Overriding packages
これ、何が何をoverrideする話をしてるんだ #?? vscodeのHaskell(拡張機能),どのHLSを使うかをpathにあるghc(あれば)で判別しているので,プロジェクトで使うghcのバージョンがpathにあるghcのバージョンと違うと"ghcide compiled against (pathにあるghcのバージョン) but current using (stackのghcバージョン)"みたいなエラーがでる?tweet 読もうnix
4種類のサポートがある
stackのNix integration
それぞれにトレードオフがある
要件
nix-shellを使う
globalには何もない状態でも動くようにしたい
VSCodeの環境を作る
versionを固定したい
また、versionを決定する方法を理解しておきたい
どれとどれとどれのversionをあわせないといけないのかわかっていない
HLS, Stack, Cabal,..
できるだけ依存するものを減らしたい
stackはcabalのラッパーなので依存が増える印象がある(?)
とりあえずちゃんと動く環境を入れたい
どっちでも
とりあえずStackは使う方向で
GHCの最新versionのサポート」は今は必要ない
必要になったらやる
これ解決したのスゴイ
もしかしたらこれでTHいけたりしないかなあ
ここにあれば何でも使えるというわけではないのかmrsekut.icon
ghc921はなんか入らなかった
雰囲気だけでnixを使っている..mrsekut.icon
Stackとcabal-installの関係もあまり理解していないのでちゃんと整理しないといけない
ノートを分けても良いかもしれないmrsekut.icon
この辺の話でややこしい話題
stackとcabalの違い
cabalとstackの歴史的変遷
元々cabalがあった
パッケージの依存関係の問題でstackが出てきた
cabalも進化して、stackを使わなくとも対応できるようになった
あとGHCupとnixの対応など
「環境構築」がどこからどこまでを指しているのかを定めないといけないかmrsekut.icon
How to install a compiler
cabal-installとstackをglobalに入れる
How to install a compiler with libraries¶
未読
How to install a compiler with libraries, hoogle and documentation indexes¶
未読
How to install haskell-language-server¶
How to make haskell-language-server find a GHC from nix-shell¶
これ
How to build a Haskell project using Stack¶
How to create ad hoc environments for nix-shell¶
これ
合わせないといけないところ
また、使用するLibraryのversion
最も簡単な例
読みたい
コレがうざすぎる
https://gyazo.com/c2068967317bf0d338d76919f401203e
一生終わらんし、途中でクラッシュする
これ入れてるpackage多すぎるからかな
そうっぽいmrsekut.icon
いったんdependenciesを消しまくってstack buildしたらならなかたt
この無限loadingってchaix使ってどうになできたりしないのか?
Template Haskell入れると(?)crashする問題
versionを良い感じに指定すればいけるはずだがその方法がわからん
実際にshell-nixで構築してるProject例
$ nix-env -iA nixpkgs.haskell.compiler.ghc865
ghcのversion指定ってこうやるの?
comp
code:nix
{
compiler ? "ghc8104",
}:
let
pkgs = import <nixpkgs> { };
cabal = pkgs.haskellPackages.cabal-install;
ghc = pkgs.haskell.packages.${compiler}.ghcWithPackages (hpkgs: with hpkgs; [
]);
in pkgs.mkShell {
nativeBuildInputs = with pkgs; [
cabal
ghc
stack
];
}
ghcide compiled against GHC 8.10.4 but currently using 8.8.4
これどういう意味なん
GHC 8.10.4を使っててもこのエラーが出る
何を直せばいいのかわからん
stack.yamlのresolverをresolver: ghc-8.10.4みたいに、versionをあわせたら↓のエラーに川田 Please ensure that ghcide is compiled with the same GHC installation as the project.
stack buildしてreloadしたらなおった
ghc8104みたいなの、提供されているversionの一覧を見たい
たとえばghc8101か何かにしたらエラーになった
どのversionを指定したか忘れたが、適当に指定したら無理な時がある
error
ghcide compiled by GHC 8.10 failed to load packages: <command line>: cannot satisfy -package weight-record-hs-0.1.0.0
$ stack clean && stack build
やれば治った
超シンプルガバガバ設定ならこんな感じ
code:nix
let
pkgs = import <nixpkgs> { };
in pkgs.mkShell {
nativeBuildInputs = [
pkgs.stack
pkgs.ghc
pkgs.cabal-install
pkgs.hlint
];
}
どの辺がガバガバか
ghcなどの固定をしていない
ただ動くのは動くはずmrsekut.icon
これを工夫してversion固定などをしていく
versionの固定
globalの引き継ぎ
というか、prompt見やすくしたいんだが
rootにshell.nix作って、中でstack initすると、ディレクトリ階層が1段おかしくなってしまうので、それをどうにかしたい
めっちゃ書いてる