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

如何禁止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:36:03