Nix保留一组原始顺序

问题描述 投票:1回答:1

假设:您已在运行NixOS或某些Linux发行版的OS上安装了yqnix

问题: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
docker docker-compose nix yq
1个回答
0
投票

Nix属性集对其属性没有排序,它们在内存中表示为排序数组。规范化值有助于再现性。

如果真的很重要,您可以编写一个函数,将一个键值对列表转换为一个Nix字符串作为JSON对象。但这并不会像builtins.toJSON那样容易使用。我认为JSON是“编译后的生成输出”,不必太担心美观。

旁注:从语义上讲,它们甚至没有以任何顺序创建。 Nix语言是声明性的:Nix表达式(不包括派生)描述的是某种东西,而不是如何创建的,尽管它可以根据功能进行定义。这对于Nix的懒惰有效是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.