假设:
您在运行 NixOS 或某些 Linux 发行版的操作系统上安装了 yq
和 nix
。
问题:
nix 可以保持集合的原始顺序吗?即,如果我创建一个sample.nix 文件:
{pkgs}:
let
dockerComposeConfig = {
version = "1.0";
services = {
srv1 = { name = "srv1"; };
srv2 = { name = "srv2"; };
};
};
in writeTextFile {
name = "docker-compose.json";
text = builtins.toJSON dockerComposeConfig;
}
当我构建输出并将其转换为下面的 yaml 时,我注意到该集合已由 Nix 按字母顺序排列。是否有一种解决方法可以使我的 JSON 保持与 Docker 用户预期相同的顺序,以便 dockerComposeConfig 属性保持其创建的顺序?
# Cmd1
nix-build -E "with import <nixpkgs> {}; callPackage ./sample.nix {}"
# Cmd2
cat /nix/store/SOMEHASH-docker-compose.json | yq r - --prettyPrint
最佳答案
Nix 属性集的属性没有顺序,它们在内存中表示为排序数组。规范化值有助于提高可重复性。
如果它真的很重要,您可以编写一个函数,将键值对列表转换为 Nix 字符串形式的 JSON 对象。但这并不像 builtins.toJSON
那样易于使用。我将 JSON 视为“编译的构建输出”,并且不太担心美观。
旁注:从语义上讲,它们甚至不是按任何顺序创建的。 Nix 语言是声明性的:Nix 表达式(不包括派生)描述的是某种东西,而不是如何创建它,尽管它可以根据函数来定义。 这对于 Nix 的懒惰发挥作用是必要的。
关于docker - Nix 维持集合的原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60429398/