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

如何在Nix表达式中获取派生(derivation)的闭包大小?

在Nix表达式中直接获取派生闭包大小的方法

问题说明

目前可通过nix path-info命令获取派生的闭包大小(以emanote为例),示例命令及输出如下:

❯ nix path-info --json -S .#default | jq 'map(select(.closureSize > 0.4e9)) | sort_by(.closureSize) | map([.path, .closureSize])'
[
  [
    "/nix/store/l3fl1fzxw6nfkbdmcf9ghjnnkl4l7vml-emanote-1.0.1.6",
    546010216
  ]
]

希望直接在Nix表达式中获取该数值,以下是可行的实现方案:

具体操作方法

方法1:使用内置函数builtins.storePathSize(Nix 2.15+适用)

从Nix 2.15版本起,官方新增了builtins.storePathSize内置函数,可直接返回指定存储路径的闭包大小(单位:字节)。示例代码:

let
  pkgs = import <nixpkgs> {};
  emanote = pkgs.emanote;
in builtins.storePathSize emanote

执行该表达式后,会直接输出对应闭包的字节数值,即示例中的546010216。

方法2:调用nix path-info命令(兼容旧版Nix)

若使用低于2.15版本的Nix,可通过在表达式中调用外部命令并解析结果的方式实现。示例代码:

let
  pkgs = import <nixpkgs> {};
  emanote = pkgs.emanote;
  closureSize = pkgs.runCommand "get-closure-size" { buildInputs = [pkgs.jq]; } ''
    nix path-info -S --json ${emanote} | jq '.[0].closureSize' > $out
  '';
in builtins.readFile closureSize

该代码会生成一个存储闭包大小的文件,再通过builtins.readFile读取数值,其中buildInputs中加入pkgs.jq用于解析JSON输出。

内容的提问来源于stack exchange,提问作者Sridhar Ratnakumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:25:24