如何禁止Nix构建过程中查询cache.nixos.org缓存?
解决方案
Nix每次构建前查询远程缓存的行为,可通过以下几种方式禁用,你可以根据自身需求选择:
方案1:单次构建临时禁用
仅对当前执行的构建命令生效,不会修改全局配置:
nix build --option substitute false
方案2:仅针对当前derivation禁用
如果不希望影响其他包的缓存使用,只需要给你编写的derivation添加allowSubstitutes = false属性即可,修改后的Nix代码如下:
with import <nixpkgs> {}; stdenv.mkDerivation { name = "testdrive"; version = "1.0.0"; src = ./. ; allowSubstitutes = false; # 新增该行即可 phases = [ "unpackPhase" "buildPhase" "installPhase" ]; buildPhase = '' ${gcc}/bin/g++ a.cc -o a ''; installPhase = '' mkdir -p $out/ cp a $out/ ''; }
方案3:全局永久禁用所有远程缓存查询
如果需要所有Nix构建都跳过远程缓存查询,可以修改配置永久生效:
- 非NixOS环境用户级配置:编辑
~/.config/nix/nix.conf,新增如下内容:substitute = false - NixOS系统级配置:编辑
/etc/nixos/configuration.nix,添加如下配置后执行nixos-rebuild switch生效:nix.extraOptions = "substitute = false";
补充:仅移除官方缓存、保留自定义缓存
如果不需要完全禁用所有缓存,只是不想查询nix官方的https://cache.nixos.org,可以修改substituters配置,删除官方缓存地址、仅保留你需要的自定义缓存地址即可,示例nix.conf配置如下:
substituters = https://你的私有缓存地址 trusted-public-keys = 你的私有缓存公钥
相关说明
你观察到的行为确实和src处理逻辑相关:你指定的src为当前工作目录,只要目录内任意文件的内容、元数据(修改时间、权限等)发生变化,src的哈希就会更新,对应整个derivation的哈希也会改变,Nix无法判断这个新哈希是否存在于远程缓存,所以每次都会发起查询。禁用substitute后Nix会直接跳过查询步骤,本地没有对应产物时直接执行本地构建。
内容的提问来源于stack exchange,提问作者Sajuuk
相关产品推荐
相关产品推荐

