haskell-jp / questions #103 at 2023-02-05 12:06:21 +0900

https://haskell-jp.slack.com/archives/CL3AXB1AL/p1675402815431589 (at atcoder-lang-update)
がんばりました。直接installしていない物も含む、全transitive dependencyのライセンスのリスト: 
この件で,あるパッケージ群の全transitive dependenciesからlicenseを取ってくる作業をしたのですが,私の知識の範囲でできる限り車輪の再開発を避けて:
1. cabal-installにdependencyを解いてもらい,
2. それをもとにHackage API を叩いて .cabal ファイルをもらってくる,
3. Cabal-syntax パッケージを使ってその .cabal ファイルをパースしてライセンス情報を取る
みたいな手段を取りました.この1.に関して質問させてください.

ここでやりたいことは,「ビルドやインストールはしなくていいけど,現環境から見た,既ビルドのものも含めた全transitive dependenciesのリストが欲しい」ということになります.このために今回は結構乱暴な手段を取りました.Docker環境があったので,まっさらなGHC+Cabalをghcupでインストールしたのち,対象のパッケージ群を全部 cabal install --lib して ghc-pkg list でインストールされている全パッケージのリストを取ってきたのです.しかし,これでは余計なパッケージまで見ている気がしますし,もうちょっとなんとかならんのか,という気がします.

色々いじっていると,適当に一個だけcabal packageを持つcabal projectを作り,Cabal packageの .cabal ファイルは目的とするパッケージ群をdependenciesに持つ library だけを持つようにし,project の cabal.project にはそれらのライブラリについて設定すべきフラグを持たせるようにすると, cabal freezecabal.project.freeze がなんかそれっぽいファイルになるのですが,これで合ってるのでしょうか…? cabal freeze が良い方法なのか,あるいは別の方法があればお教えいただければありがたいです.
ざっとcabal-installのドキュメントとソースを確認しただけですけど、 cabal-freeze で特にダメな理由が思いつかないです。
参考 https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-freeze
なるほど.ありがとうございます.もう一つ質問なのですが, cabal.project 系ファイルの constraint の syntax や parser って cabal-install が internal library として持ってるのでしょうか?

active-repositories: 
constraints: any.OneTuple ==0.3.1,
             any.QuickCheck ==2.14.2,
             QuickCheck -old-random +templatehaskell,
             any.StateVar ==1.2.2,
             any.adjunctions ==4.4.2,
             any.array ==0.5.4.0,
             any.assoc ==1.0.2,
             any.atomic-primops ==0.8.4,
             atomic-primops -debug,
.....
             any.void ==0.7.3,
             void -safe
index-state:  2023-02-02T00:29:35Z

みたいな出力の any. を説明する文書が見当たらないからどうパースをかけていいかわからなくて…
Distribution.Client.ProjectConfig.ProjectConfig 型はそれっぽいと言えばぽいのですが….
Hiromi ISHII / mr_konn
この辺の情報は plan.json に書き出されていて、cabal-plan というツールを使うとこいつをパーズして色々とってこれます。stack dot に対応する cabal-plan dot とかすると Graphviz の dot ファイルをはいてくれたりしますね
Hiromi ISHII / mr_konn
cabal-plan license-report が欲しかった機能そのものですかね:

https://hackage.haskell.org/package/cabal-plan

stackベースのプロジェクトだと、licensorというのがライセンスリポートを作ってくれたりします
@Hiromi ISHII / mr_konn 試してみましたが,まさにそのまんまですね! 作業が楽になります.ありがとうございます!
@igrep おかげさまでだんだんわかってきました! 結局完全に理解できているとは言い難いのですが,取りあえず any. がついてる限りは気にしないでよさそうだ,ということはわかってきました.今回は cabal-plan を使えばよさそうですが,参考になりました! ありがとうございます!