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

NixOS下Cabal无法找到依赖包问题求助

解决NixOS上SimplePathFinding的Cabal构建问题

我在NixOS上折腾Haskell项目时也碰到过类似的依赖隔离问题,给你几个针对性的解决方案:

方案一:用Nix Shell搭建隔离构建环境(最省心)

Nix Shell能帮你快速搭建包含所有必要工具的临时环境,避免Cabal和Nix的环境冲突:

  1. 在项目根目录新建一个shell.nix文件,内容如下:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = with pkgs; [
    ghc
    cabal-install
    alex
    happy
    c2hs
  ];
}
  1. 运行nix-shell进入这个环境,等待依赖下载安装完成
  2. 在这个Shell里直接执行:
    cabal configure
    cabal build
    
    这样Cabal就能直接找到环境里的alex、happy、c2hs,不会出现依赖找不到的问题

方案二:调整Cabal的Nix集成配置

如果你坚持想用cabal --enable-nix的方式,需要让Cabal明确知道要从Nix拉取哪些依赖:

  1. 在项目根目录创建或修改cabal.project文件,添加以下内容:
packages: .
nix: True
nix:packages: [ alex happy c2hs ]
  1. 然后执行命令:
    cabal --enable-nix build
    
    这样Cabal会让Nix负责提供所有指定的依赖,同时在构建PathFinder时能正确关联这些包实例

方案三:用Nix原生构建(最符合NixOS生态)

如果想彻底用Nix管理整个构建流程,可以生成项目的Nix构建文件:

  1. 先安装cabal2nix工具:
    nix-env -iA nixpkgs.cabal2nix
    
  2. 在项目根目录运行:
    cabal2nix . > default.nix
    
  3. 最后执行nix-build,Nix会自动处理所有依赖并完成构建,生成的可执行文件会在result/bin目录下

为什么之前的方法会失败?

  • 用cabal --enable-nix install安装依赖时,这些包是放在Cabal创建的隔离Nix环境里,后续配置PathFinder时没有复用这个环境,所以找不到实例
  • 不用--enable-nix时,NixOS默认没有全局的Haskell包仓库,Cabal无法从系统路径找到c2hs等工具,因为NixOS不允许随意安装全局包到系统目录

内容的提问来源于stack exchange,提问作者liminal18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:27:05