如何在Nix中正确覆写coreutils?编译报错求助
如何在Nix中正确覆写Coreutils并避免依赖链错误
你遇到的问题根源在于错误地修改了stdenv的全局overrides——stdenv是Nix所有包的基础构建环境,直接修改它的依赖会打乱整个构建链,导致perl构建失败、C编译器丢失这类连锁问题。
正确的覆写方式
不需要碰stdenv,直接在overlay顶层覆写coreutils即可。把你的~/.config/nixpkgs/overlays/main.nix改成下面这样:
_: super: { coreutils = super.coreutils.override { aclSupport = false; }; }
为什么原来的方法会出错
你之前的代码通过修改stdenv.overrides强制替换coreutils,但stdenv本身就依赖coreutils,这会造成循环依赖或构建环境的破坏:
- perl的postInstall阶段依赖coreutils的工具,替换后工具链的兼容性出问题,导致"无法将null强制转换为字符串"的错误;
- 修改stdenv的overrides会影响gcc等编译器的依赖链,最终导致构建环境中找不到
cc。
Nix的overlay机制本身就会自动处理依赖替换——只要你在顶层覆写了coreutils,所有依赖它的包都会自动使用这个新的版本,完全不需要手动修改stdenv。
验证方法
执行你原来的安装命令:
nix-env -iA nixpkgs.coreutils --show-trace
这次应该能顺利安装禁用了aclSupport的coreutils,不会再出现之前的错误。
内容的提问来源于stack exchange,提问作者KAction
相关产品推荐
相关产品推荐

