You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:15:02