我想弄清楚对于给定的 nixpkgs 版本,Haskell 软件包的具体版本会被选中。我对此很感兴趣,因此我知道要查看哪个文档版本,可以在 .cabal 文件中设置版本约束,了解在推广 nixpkgs 版本时出现问题的原因等。
我主要查看 nixpkgs 22.11,因为我们的代码最后就是在这个版本中运行的。我从 github 克隆了 Nixos/nixpkgs 并检查了该分支。很快我就发现了 pkgs/development/haskell-modules/hackage-packages.nix,其中有很多与 Haskell 命名相同的包,但没有“base”,只有“base_4_17_0_0”,除了“aeson”之外,还有“aeson_1_5_6_0”和“aeson_2_1_1_0”。
由此我得出结论,某个地方一定存在从 Haskell 的名称(如“base”和“aeson”)到源文件中某个内容的映射。但在哪里呢?搜索“base_4_17_0_0”只会得到一个匹配项。
我还发现 Cabal2nix 会输出一个配方,输入名为“base”和“aeson”的东西,并间接将它们传递给 mkDerivation。我认为 mkDerivation 太笼统了,无法特别了解 Haskell,那么这个映射可能在哪里呢?
像 这样的引导库
base
与 GHC 版本绑定;请参阅此表了解映射。像 这样的内容haskellPackages.base
被设置为,因为它们由 GHC 提供。要确定 nixpkgs 中的 GHC 版本,您可以直接构建它或查看中的或 的null
定义。haskellPackages
ghc
pkgs/top-level/all-packages.nix
我们
mkDerivation
在 Haskell 中使用的不是通用的,而是在 中定义的pkgs/development/haskell-modules/make-package-set.nix
。附言:我怀疑{关注 Stack Overflow 问题的人} 和 {知道 nixpkgs 中的 Haskell 基础设施如何运作的人} 的交集就是我,所以以后我建议你在 中提问
#haskell:nixos.org
。谢谢 Naim!
知道了这一点,我想出了这个程序:
我不知道其他人怎么想,但我认为当你只想知道你得到的是哪个版本的软件包时,这太难了。在我看来,这是一个非常重要的用例。
有没有更简单的方法?可以实现更简单的方法吗?Flakes 提供了什么吗?
我还担心将特定 nixpkgs 版本的数据与特定 ghc 版本的数据合并。这似乎注定会失败。