NixOS下Cabal无法找到依赖包问题求助
解决NixOS上SimplePathFinding的Cabal构建问题
我在NixOS上折腾Haskell项目时也碰到过类似的依赖隔离问题,给你几个针对性的解决方案:
方案一:用Nix Shell搭建隔离构建环境(最省心)
Nix Shell能帮你快速搭建包含所有必要工具的临时环境,避免Cabal和Nix的环境冲突:
- 在项目根目录新建一个
shell.nix文件,内容如下:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = with pkgs; [ ghc cabal-install alex happy c2hs ]; }
- 运行
nix-shell进入这个环境,等待依赖下载安装完成 - 在这个Shell里直接执行:
这样Cabal就能直接找到环境里的alex、happy、c2hs,不会出现依赖找不到的问题cabal configure cabal build
方案二:调整Cabal的Nix集成配置
如果你坚持想用cabal --enable-nix的方式,需要让Cabal明确知道要从Nix拉取哪些依赖:
- 在项目根目录创建或修改
cabal.project文件,添加以下内容:
packages: . nix: True nix:packages: [ alex happy c2hs ]
- 然后执行命令:
这样Cabal会让Nix负责提供所有指定的依赖,同时在构建PathFinder时能正确关联这些包实例cabal --enable-nix build
方案三:用Nix原生构建(最符合NixOS生态)
如果想彻底用Nix管理整个构建流程,可以生成项目的Nix构建文件:
- 先安装
cabal2nix工具:nix-env -iA nixpkgs.cabal2nix - 在项目根目录运行:
cabal2nix . > default.nix - 最后执行
nix-build,Nix会自动处理所有依赖并完成构建,生成的可执行文件会在result/bin目录下
为什么之前的方法会失败?
- 用
cabal --enable-nix install安装依赖时,这些包是放在Cabal创建的隔离Nix环境里,后续配置PathFinder时没有复用这个环境,所以找不到实例 - 不用
--enable-nix时,NixOS默认没有全局的Haskell包仓库,Cabal无法从系统路径找到c2hs等工具,因为NixOS不允许随意安装全局包到系统目录
内容的提问来源于stack exchange,提问作者liminal18
相关产品推荐
相关产品推荐

