Haskellの環境構築
DevboxでHaskellプロジェクトを作る
これがダントツで簡単かもmrsekut.icon
関連
Haskellでscriptを書く
環境構築しないでHaskellする
nix-shellとStackでHaskellプロジェクトの新規作成
#WIP
問題を切り分けよう
単純にHaskellのプロジェクトを作ること自体はそこまで大変ではない
ただ、選択肢が多くてどれを選べばよいのかわからない問題はある
難があるのはHLSを動かすこと
つまり、エディタの補完とかがない状態ならすぐに作れる
登場人物が多い
GHCup
Stack
HLS
cabal
GHC
Stackage
nix
devbox
etc.
そのため、組み合わせが多い
NixでGHC等を入れるのは簡単
projectごとに入れられる
GHCupでもGHC等を入れるのは簡単
GHCupを入れる
ただしglobalに入っちゃう
おすすめHaskellプロジェクト作成方法(ほぼ)2021年版
https://zenn.dev/mod_poppo/articles/haskell-setup-2023
問題はHLSだなあmrsekut.icon
Nixで入れても、GHCupで入れても連携がうまく行ってない
VSCode、HLS周りとGHC周りの連携をどうにかしたい
ここがちゃんとできるようになればほぼ全部解決する
https://gyazo.com/0bc6a308d669b993fea3eab66da062f5
右の方にhls-poweredと書いてる
haskell.serverExecutablePath
要素が多すぎるねmrsekut.icon
GHCup, Stack, HLS, cabal, GHC, Stackage
どれを基準に、合わせていけばよいのかわからない
GPT-4.iconに聞いたのでそれをやっていく
まず、Stackageで、LTSのversionを決定する
現在は、lts-22.3っぽかったのでこれをstack.ymlに書く
code:stack.yml
resolver: lts-22.3
その後、それに合うGHCを入れる
ghc 9.6.3がそれらしい
λ stack setupを打つべきらしいが、
λ stack exec -- ghc --versionを打ったら勝手にinstallが始まった
λ stack exec -- ghc --versionでghc9.6.3と出力されるか確認
プロジェクトの依存関係のinstall
$ stack build
HLSの設定
ghcupを使って入れる
https://github.com/haskell/haskell-language-server/releases
リリースページに対応しているGHCのバージョンが書かれている
$ ghcup install hls
これで自動的に良い感じのバージョンを選んで入れてくれるらしい
VSCode Haskellはこの辺を適切なversionで自動でdownloadするので自分で入れる必要はない ref
hie
hie-wrapper
hie-bios
haskell-language-server-wrapper
haskell-language-server
ghcide
https://cah6.github.io/technology/nix-haskell-1/
いつの記事かわからんけど、これを試してみる
これpart3まであって長い
今のmrsekut.iconの環境にはすでにglobalにstackなどが入っており、VSCodeもhieで正常に動くけど、まあやってみるかという感じである
最終的にはnix-shellでprojectごとに環境をsetupするのhs版と、VSCode上でhs環境が動けばok
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によるHaskell開発環境の構築 - syocy’s diary
読もうnix
https://zenn.dev/mod_poppo/articles/haskell-setup-2023
https://qiita.com/junjihashimoto@github/items/8ce130e2db394918c1ea
4種類のサポートがある
cabal2nix
StackのNix integration
haskell.nix
stacklock2nix
それぞれにトレードオフがある
要件
nix-shellを使う
globalには何もない状態でも動くようにしたい
VSCodeの環境を作る
versionを固定したい
また、versionを決定する方法を理解しておきたい
たとえば、これだけのためにGHCup使うなど
どれとどれとどれのversionをあわせないといけないのかわかっていない
HLS, Stack, Cabal,..
できるだけ依存するものを減らしたい
stackはcabalのラッパーなので依存が増える印象がある(?)
とりあえずちゃんと動く環境を入れたい
どっちでも
時間掛かるならCachix使いたい
とりあえずStackは使う方向で
cabal2nixはどっちでもいい
GHCの最新versionのサポート」は今は必要ない
必要になったらやる
https://haskell-jp.slack.com/archives/CR2TETE5R/p1632560266086500
これ解決したのスゴイ
もしかしたらこれでTHいけたりしないかなあ
https://dev.to/piq9117/nix-trying-out-haskell-with-less-hassle-2if
https://github.com/kgtkr/haskell-nix-playground//
https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/haskell-packages.nix
ここにあれば何でも使えるというわけではないのかmrsekut.icon
ghc921はなんか入らなかった
雰囲気だけでnixを使っている..mrsekut.icon
haskell4nix
https://qiita.com/algas/items/b8ad90051474322827eb
GitHub Codespacesを使った方法
Stackとcabal-installの関係もあまり理解していないのでちゃんと整理しないといけない
Haskellに纏わるツールたち#5e52b06f1982700000860271にも書いている
ノートを分けても良いかもしれないmrsekut.icon
GHC 環境構築 概観 と PowerShell - 趣味はデバッグ……
最近のstackとcabalについて簡単に
この辺の話でややこしい話題
stackとcabalの違い
cabalとstackの歴史的変遷
元々cabalがあった
パッケージの依存関係の問題でstackが出てきた
cabalも進化して、stackを使わなくとも対応できるようになった
あとGHCupとnixの対応など
「環境構築」がどこからどこまでを指しているのかを定めないといけないかmrsekut.icon
haskell4nixにいろいろ書かれている
https://haskell4nix.readthedocs.io/nixpkgs-users-guide.html#how-to-create-a-development-environment
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¶
pkgs.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¶
これ
合わせないといけないところ
stack.yamlのresolverのversionと、GHCのversion
また、使用するLibraryのversion
最も簡単な例
https://zenn.dev/konn/articles/1a60baba9848a1
読みたい
コレがうざすぎる
https://gyazo.com/c2068967317bf0d338d76919f401203e
一生終わらんし、途中でクラッシュする
これ入れてるpackage多すぎるからかな
そうっぽいmrsekut.icon
いったんdependenciesを消しまくってstack buildしたらならなかたt
この無限loadingってchaix使ってどうになできたりしないのか?
Template Haskell入れると(?)crashする問題
versionを良い感じに指定すればいけるはずだがその方法がわからん
haskell.nix
haskell-nix
https://github.com/nmattia/snack
実際にshell-nixで構築してるProject例
concrete-utopia/utopia
https://github.com/concrete-utopia/utopia/blob/master/shell.nix
$ nix-env -iA nixpkgs.haskell.compiler.ghc865
ghcのversion指定ってこうやるの?
haskellPackages
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
https://github.com/haskell/haskell-language-server/issues/735
$ stack clean && stack build
やれば治った
https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/haskell.section.md
https://maybevoid.com/posts/2019-01-27-getting-started-haskell-nix.html
超シンプルガバガバ設定ならこんな感じ
code:nix
let
pkgs = import <nixpkgs> { };
in pkgs.mkShell {
nativeBuildInputs = [
pkgs.stack
pkgs.ghc
pkgs.cabal-install
pkgs.hlint
];
}
どの辺がガバガバか
nixpkgsのversionを固定していない
ghcなどの固定をしていない
ただ動くのは動くはずmrsekut.icon
これを工夫してversion固定などをしていく
versionの固定
globalの引き継ぎ
というか、prompt見やすくしたいんだが
rootにshell.nix作って、中でstack initすると、ディレクトリ階層が1段おかしくなってしまうので、それをどうにかしたい
https://input-output-hk.github.io/haskell.nix/
めっちゃ書いてる
https://qiita.com/rizkubo/items/7b9d2f701df37dd666b7
https://docs.haskellstack.org/en/stable/nix_integration/
https://jsapachehtml.hatenablog.com/entry/2020/08/23/105935
https://maybevoid.com/posts/2019-01-27-getting-started-haskell-nix.html
https://discourse.nixos.org/t/cant-make-hie-work-on-vs-code-with-nix/5277
https://cah6.github.io/technology/nix-haskell-1/
https://cah6.github.io/technology/nix-haskell-2/
https://cah6.github.io/technology/nix-haskell-3/
https://hmemcpy.com/2020/02/setting-up-a-haskell-development-environment-in-minutes-in-vscode/
https://www.srid.ca/haskell-nix
https://discourse.nixos.org/t/nix-haskell-development-2020/6170
https://input-output-hk.github.io/haskell.nix/
https://kakkun61.hatenablog.com/entry/2019/11/20/GHC_環境構築_概観_と_PowerShell
https://kakkun61.hatenablog.com/entry/2020/06/06/Haskell_環境構築ツールフローチャートを作りました
/LugendrePublic/Haskell環境構築2020簡易版 (macOS, Linux向け)