如何在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
相关产品推荐
相关产品推荐

