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

如何让Cabal识别Nix安装的alex和happy,避免重复构建

Cabal v2在nix-shell中识别Nix安装的alex/happy解决方案

问题根因

Cabal v2(new-build)默认会自行管理所有构建依赖,包括build-tool-depends中声明的构建工具,即使系统PATH中存在符合版本要求的对应工具,默认也会尝试重新构建,这和直接读取PATH的v1构建逻辑不同。你之前配置的extra-prog-path写法有误,该配置接受的是目录路径而非可执行文件全路径,所以也没有生效。

调整步骤

1. 简化shell.nix配置

移除重复的alex、happy声明,无需手动设置ALEX、HAPPY环境变量,只要将两个工具加入buildInputs即可,进入nix-shell时它们的二进制路径会自动加入系统PATH:

{ pkgs ? import <nixpkgs> {}}:
let 
    ghc = pkgs.haskellPackages.ghcWithPackages (p:[
        p.array
        p.base
        p.bound
        p.containers
        p.deriving-compat
        p.haskeline
        p.logict
        p.mtl
        p.text
        p.unification-fd
        p.BNFC
        p.cabal-install
    ]);
in 
    pkgs.mkShell {
        buildInputs = [ 
            ghc 
            pkgs.haskellPackages.alex 
            pkgs.haskellPackages.happy 
            pkgs.pkg-config
        ];
    }

2. 配置cabal.project跳过工具构建

在你的cabal.project中添加system-build-tools配置,明确告诉Cabal这两个构建工具已经在系统中安装,无需自行构建:

packages: simple.cabal
system-build-tools:
  alex >= 3.2.6,
  happy >= 1.20.0

验证

执行nix-shell --pure shell.nix进入环境后运行cabal build,Cabal将直接识别Nix安装的alex和happy,不会再尝试重新构建这两个工具。

如果不想修改cabal.project,也可以在构建时临时指定工具路径:

cabal build --with-alex=$(which alex) --with-happy=$(which happy)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:04