haskell-jp / questions #100 at 2022-01-29 09:13:45 +0900

beginners であった @Endo Ryunosuke / minerva さんの質問 https://haskell-jp.slack.com/archives/CR2TETE5R/p1643286256145989 を見てて思ったのですが、Cabal (cabal-the-library, Stack とか cabal-installから呼ばれるやつ) と cabal-install (cabal-the-command-line-tool) の違いってなんでしょう。つまり、Cabalがやらなくてcabal-installがやることってなんでしょうか。もちろんCabalはコマンドラインオプションの解析はしないわけですし、Cabalのdependencyを見るに、インターネット接続が必要な、パッケージのダウンロードはやらなそうに見えるのですが…。
ちゃんとソース読んだわけじゃないので私も確かなことは言えないのですが、stackやcabal-installがCabalのフロントエンド、という説明で十分な気がするんですが、いかがでしょうか?「Cabalがやらなくてcabal-installがやること」に対する答えは質問文にある「コマンドライン引数の解析」などなのではないかと
んー… 例えばなんですが、 HTTP だの network-uri だの hackage-security だののパッケージは cabal-install のdependencyではあるんですが、 Cabal のdependencyではないし、 あと、 cabal-install-solver という「ライブラリ」が全部 cabal-install executableの other-modules になってたりするので、パッケージを選択してダウンロードするところまで全部 cabal-install 占有の機能で、 Cabal は落ちてきたパッケージ群をビルドしているだけなのでは、みたいな疑問があったんですよね。 そうなった時に Cabal って実際どこまでの機能を持ってるんだろうと。
というかそもそもこういうでかいパッケージってどっから読んだらいいかわからん、というのがあってですね…。GHCとかどうやって読めば良いんだろう。
実際にコードを追ったわけではないので大雑把にですが
• Cabal: Setup.hsができること
• cabal-install: 依存関係の解決も含む残りすべて
と理解しています。
<@UL1HFJATE> cabal-install に network が使われているというところまで分かっているのですから、grep -r Network.Socket * を実行し、該当したモジュールから読み始めるのはいかがですか?
@maoe なるほど。ビルドスクリプトにできるべきことは全部できるべき、と言うlibraryだ、みたいな話でしょうか。
@kazu ! network 自体は (`network-uri` とは異なり) dependency ではないのでそのgrepはemptyでしたが、 HTTP も dependencyなのでそのモジュールを読むのは意味がありそうですね。ありがとうございます!