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

Nix环境下GHC 9.14.1搭配Haskell Language Server失败的修复

解决GHC 9.14.1下algebraic-graphs与containers版本冲突的Nix方案

方法1:通过override调整algebraic-graphs的依赖约束

在你的flake.nix中,针对haskellPackages里的algebraic-graphs包,强制修改其containers依赖的版本限制,让它兼容GHC 9.14.1自带的containers 0.8。示例代码如下:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
        haskellPkgs = pkgs.haskell.packages.ghc914.override {
          overrides = self: super: {
            algebraic-graphs = super.algebraic-graphs.overrideAttrs (oldAttrs: {
              doCheck = false; # 可选:若新版本测试不兼容,可临时关闭检查
              preConfigure = oldAttrs.preConfigure or "" + ''
                sed -i 's/containers < 0.8/containers >= 0.4 && < 0.9/' algebraic-graphs.cabal
              '';
            });
          };
        };
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            haskellPkgs.ghc
            haskellPkgs.cabal-install
            haskellPkgs.haskell-language-server
            # 其他所需依赖
          ];
        };
      }
    );
}

方法2:使用Nix Overlay全局替换包

如果需要让整个环境中的algebraic-graphs都使用修改后的版本,可以在flake中添加overlay:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        overlay = final: prev: {
          haskell = prev.haskell // {
            packages = prev.haskell.packages // {
              ghc914 = prev.haskell.packages.ghc914.override {
                overrides = self: super: {
                  algebraic-graphs = super.algebraic-graphs.overrideAttrs (oldAttrs: {
                    preConfigure = ''
                      sed -i 's/containers < 0.8/containers >= 0.4 && < 0.9/' algebraic-graphs.cabal
                    '';
                  });
                };
              };
            };
          };
        };
        pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; };
        haskellPkgs = pkgs.haskell.packages.ghc914;
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            haskellPkgs.ghc
            haskellPkgs.cabal-install
            haskellPkgs.haskell-language-server
          ];
        };
      }
    );
}

方法3:直接使用兼容containers 0.8的algebraic-graphs版本

检查algebraic-graphs的最新版本,若已修复containers版本限制,直接指定使用该版本:

# 在override中替换为实际存在的兼容版本
algebraic-graphs = pkgs.haskell.lib.dontCheck (pkgs.haskell.lib.doJailbreak super.algebraic-graphs_0.7.1);

关键说明

  • doJailbreak:用于解除包的版本约束限制,是Nix Haskell工具链中绕过版本冲突的常用手段,但需注意可能引入兼容性问题。
  • dontCheck:若修改后的包测试用例无法通过,可临时关闭测试以完成构建,后续再排查测试问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:28:17