如何查询指定nixpkgs版本对应的Haskell包具体版本?
解决nixpkgs中Haskell标准包名到带版本后缀包的映射问题
核心逻辑:映射由Haskell Package Set自动管理
nixpkgs里的haskellPackages属性集是暴露给用户的标准Haskell包入口,里面的base、aeson等标准包名,对应hackage-packages.nix中特定版本后缀的包。这个映射不是硬编码的一对一关系,而是通过package set的配置逻辑自动关联的,核心配置文件在pkgs/development/haskell-modules/configuration-common.nix。
具体映射位置与查询方法
1. 直接用nix repl查询对应版本
这是最快捷的方式,无需翻源码:
- 打开终端,运行:
nix repl '<nixpkgs/22.11>' - 在repl中输入以下命令查询版本:
haskellPackages.base.version # 输出4.17.0.0(对应nixpkgs 22.11的GHC 9.2.5) haskellPackages.aeson.version # 输出22.11分支默认的aeson版本
2. 查看package set的配置文件
- 对于普通Hackage包(比如aeson),默认版本的选择在
configuration-common.nix中定义,通过defaultPackageOverrides或者直接指定package set的默认包版本。 - 对于GHC自带核心库(比如base),版本完全和GHC绑定:nixpkgs 22.11使用GHC 9.2.5,而GHC 9.2.5对应的base版本就是4.17.0.0。这部分关联在GHC的derivation中处理,
hackage-packages.nix里的base_4_17_0_0是nixpkgs为统一包处理逻辑生成的包装derivation。
3. 解析cabal2nix生成的配方
cabal2nix生成的nix文件中,mkDerivation的buildInputs里的base实际是引用haskellPackages.base,而这个属性最终指向hackage-packages.nix中对应的带版本后缀的包。你可以在nix repl中执行haskellPackages.base查看完整的derivation路径,确认它对应的是base_4_17_0_0。
额外提示:排查版本差异
当升级nixpkgs后出现代码问题时,你可以用同样的repl方法对比新旧版本的haskellPackages.<包名>.version,快速定位是哪个包的版本变更导致的问题。
内容的提问来源于stack exchange,提问作者Adrian May
相关产品推荐
相关产品推荐

