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
相关产品推荐
相关产品推荐

