为何部分Nix表达式无法通过mkBinaryCache正常命中缓存?
Nix本地二进制缓存无法命中symlinkJoin构建产物的问题
我正尝试在CI场景中使用Nix,通过mkBinaryCache构建本地二进制缓存,以便在容器中进行Nix构建时无需从cache.nixos.org下载大量内容,但发现部分Nix表达式无法如预期命中缓存。
测试设置
- 令
EXPR为某个Nix表达式。 - 构建
pkgs.mkBinaryCache { rootPaths = [ (${EXPR}) ]; },并将路径保存为BUILT_CACHE。 - 令
SUBSTITUTER="file://${BUILT_CACHE}?trusted=true"。 - 创建临时目录作为全新存储,并运行以下命令:
nix-build -E "$EXPR" -v \ --store "$STORE" \ --option substituters "$SUBSTITUTER" \ --option trusted-substituters "$SUBSTITUTER" \ --no-link \ --max-jobs 0
我的目标是仅通过从substituter下载完成构建,--max-jobs 0应能阻止Nix进行本地构建,整个流程已写成Bash脚本。
测试结果
- 当
EXPR为pkgs.hello时流程正常; - 当
EXPR为pkgs.symlinkJoin { name = "test"; paths = []; }时失败,它会列出大量待构建的派生文件,似乎要自行构建符号链接文件夹。
这与我对Nix的认知不符,我认为它应计算symlinkJoin表达式的预期存储路径并查询缓存。我发现缓存目录存在对应输出的.narinfo文件,但Nix似乎未查询该路径的substituter,这是怎么回事?
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

