是否可以在不运行NixOS的计算机上保持我的Nix软件包同步?

Lew*_*wis 2 nix

我知道使用NixOS,您可以简单地复制configuration.nix文件以同步您的操作系统状态,包括机器之间安装的软件包.

那么,是否有可能使用非NixOS操作系统上的Nix包管理器来同步仅安装已安装的包?

aka*_*vel 8

请注意,至少从2017年3月30日开始(对应于17.03 Nix/NixOS频道/发布),据我所知,官方,现代,支持和建议的解决方案是使用所谓的叠加.

请参阅nixpkgs手册中标题为"Overlays"的章节,以获取有关如何使用新方法的精彩指南.

作为简短摘要:您可以在目录中放置任意数量的扩展名为.nix的文件$HOME/.config/nixpkgs/overlays/.它们将按字母顺序处理,每个都可以修改可用的Nix包集.必须按以下模式编写每个文件:

self: super:
{
  boost = super.boost.override {
    python = self.python3;
  };
  rr = super.callPackage ./pkgs/rr {
    stdenv = self.stdenv_32bit;
  };
}
Run Code Online (Sandbox Code Playgroud)
  • super集合对应于"旧"包的集合(在应用叠加之前).如果你想引用旧版本的软件包(boost如上所述),或者callPackage你应该通过它来引用它super.

  • self集合对应于最终的"未来"包组,表示应用所有叠加后的最终结果.(注意:当有时使用它们时,不要害怕被Nix拒绝,因为它会导致无限递归.可能你应该只是super在这些情况下使用.)

注意:通过上述更改,我在原始答案中提到的解决方案现在似乎已"弃用" - 我相信它应该仍然可以在2017年4月开始工作,但我不知道多长时间.它在nixpkgs存储库中显示为"过时".



老答案,17.03之前:

假设你要同步应用程序的每用户(非NixOS尼克斯保持可见的应用程序在每个用户的基础,而不是全系统,据我所知),它可能的声明做.它只是在手册中没有得到很好的宣传 - 虽然它似乎在长期的Nixers中很受欢迎!

您必须在以下位置创建文本文件:$HOME/.nixpkgs/config.nix- 例如:

$ mkdir -p ~/.nixpkgs
$ $EDITOR ~/.nixpkgs/config.nix
Run Code Online (Sandbox Code Playgroud)

然后输入以下内容:

{
  packageOverrides = defaultPkgs: with defaultPkgs; {
    home = with pkgs; buildEnv {
      name = "home";
      paths = [
        nethack mc pstree #...your favourite pkgs here...
      ];
    };
  };
}
Run Code Online (Sandbox Code Playgroud)

然后你应该能够安装所有列出的包:

$ nix-env -i home
or:
$ nix-env -iA nixos.home   # *much* faster than above
Run Code Online (Sandbox Code Playgroud)

paths你可以像在/etc/nixos/configuration.nixNixOS上类似的方式放东西.此外,home这里实际上是一个"假包".您可以在其旁边添加更多自定义程序包定义,然后将它们包含在"路径"中.

(旁注:我希望写一篇博客文章,了解我如何运作,以及如何通过更多自定义来扩展它.如果我成功,我会尽量记住在这里链接它.)