Nix поддерживает оригинальный порядок набора - PullRequest
0 голосов
/ 27 февраля 2020

Допущения:
У вас yq и nix установлены в вашей ОС под управлением NixOS или некоторых Linux дистрибутивов.

Вопрос:
Может ли 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

1 Ответ

1 голос
/ 27 февраля 2020

Наборы атрибутов Nix не имеют порядка их атрибутов, и они представлены в виде отсортированного массива в памяти. Канонизация значений помогает с воспроизводимостью.

Если это действительно важно, вы можете написать функцию, которая превращает список пар ключ-значение в объект JSON в виде строки Nix. Но это не будет легко использовать, как builtins.toJSON. Я бы рассматривал JSON как «вывод скомпилированной сборки» и не слишком беспокоился об эстетике.

Примечание: Семантически они даже не создаются ни в каком порядке. Язык Nix является декларативным: выражение Nix (исключая деривации) описывает нечто, а не то, как его создавать, хотя оно может быть определено в терминах функций. Это необходимо, чтобы лень Никса была эффективной.

...