Можно ли синхронизировать мои пакеты Nix на машинах, не работающих под управлением NixOS?

Я знаю, что с NixOS вы можете просто скопировать файл configuration.nix, чтобы синхронизировать состояние вашей ОС, включая установленные пакеты между машинами.

Возможно ли сделать то же самое, используя диспетчер пакетов Nix в ОС, отличной от NixOS, для синхронизации только установленных пакетов?


nix
person Lewis    schedule 21.07.2016    source источник


Ответы (1)


Обратите внимание, что по крайней мере с 30.03.2017 (соответствует каналу/выпуску 17.03 Nix/NixOS), насколько я понимаю, официальным, современным, поддерживаемым и предлагаемым решением является использование так называемых оверлеев .

См. главу "Наложения" в руководстве nixpkgs за хорошее руководство по использованию нового подхода.

Вкратце: вы можете поместить любое количество файлов с расширением .nix в каталог $HOME/.config/nixpkgs/overlays/. Они будут обрабатываться в алфавитном порядке, и каждый из них может модифицировать набор доступных пакетов Nix. Каждый из файлов должен быть записан по следующему шаблону:

self: super:
{
  boost = super.boost.override {
    python = self.python3;
  };
  rr = super.callPackage ./pkgs/rr {
    stdenv = self.stdenv_32bit;
  };
}
  • Набор super соответствует "старому" набору пакетов (до применения оверлея). Если вы хотите сослаться на старую версию пакета (как в boost выше) или callPackage, вы должны сослаться на нее через super.

  • Набор self соответствует возможному, «будущему» набору пакетов, представляющему окончательный результат после применения всех наложений. (Примечание: не пугайтесь, иногда их использование может быть отклонено Nix, так как это приведет к бесконечной рекурсии. Возможно, вам лучше просто использовать super в таких случаях.)

Примечание: с приведенными выше изменениями решение, которое я упоминаю ниже в исходном ответе, теперь кажется «устаревшим» — я считаю, что оно должно работать по состоянию на апрель 2017 года, но я понятия не имею, как долго. Похоже, что он помечен как "устаревший" в nixpkgs. репозиторий.



Старый ответ до 17.03:

Предполагая, что вы хотите синхронизировать приложения для каждого пользователя (поскольку Nix, отличная от NixOS, сохраняет видимость приложений для каждого пользователя , а не для всей системы, насколько мне известно), можно сделать это декларативно. Это просто не очень хорошо рекламируется в руководстве, хотя, кажется, довольно популярно среди давних Nixers!

Вы должны создать текстовый файл по адресу: $HOME/.nixpkgs/config.nix например:

$ mkdir -p ~/.nixpkgs
$ $EDITOR ~/.nixpkgs/config.nix

затем введите следующее содержимое:

{
  packageOverrides = defaultPkgs: with defaultPkgs; {
    home = with pkgs; buildEnv {
      name = "home";
      paths = [
        nethack mc pstree #...your favourite pkgs here...
      ];
    };
  };
}

Затем вы сможете установить все перечисленные пакеты с помощью:

$ nix-env -i home
or:
$ nix-env -iA nixos.home   # *much* faster than above

В paths вы можете размещать вещи так же, как и в /etc/nixos/configuration.nix на NixOS. Кроме того, home на самом деле является "поддельным пакетом". Вы можете добавить рядом с ним дополнительные определения пользовательских пакетов, а затем включить их в свои «пути».

(Примечание: я надеюсь написать сообщение в блоге с тем, что я узнал о том, как именно это работает, а также показать, как расширить его с помощью дополнительных настроек. Я постараюсь не забыть связать это здесь если у меня получится.)

person akavel    schedule 21.07.2016
comment
Большое спасибо! Это именно то, что я искал. Хотелось бы, чтобы это было лучше задокументировано в официальном руководстве для начинающих, таких как я. - person Lewis; 23.07.2016
comment
Сообщение в блоге, пожалуйста! :) - person tlo; 03.09.2016
comment
@tlo WILCO :) Это все еще назревает, я медленно пишу. Кстати, пользуясь случаем, вам будет интереснее прочитать о том, как сделать больше настроек раньше (т.е. об использовании) или как именно это работает (т.е. о внутренних компонентах) ? Я нахожусь в точке разветвления того, как планировать сериал, так что это идеальный момент, чтобы повлиять на него :) - person akavel; 05.09.2016
comment
@akavel Я бы предпочел, как именно это работает, желательно с некоторыми примерами. Спасибо! - person tlo; 06.09.2016
comment
Я считаю, что «устаревший» комментарий относится к пути ~/.nixpgks, отличному от XDG, а не к ~/.config/nixpkgs. - person Sebastian Graf; 02.02.2018