是否可以让我的 Nix 包在机器之间保持同步而不是 运行 NixOS?

Is it possible to keep my Nix packages in sync across machines not running NixOS?

我知道 NixOS,你可以简单地复制 configuration.nix 文件来同步你的 OS 状态,包括机器之间安装的包。

是否可以在非 NixOS OS 上使用包管理器 Nix 执行相同的操作以仅同步已安装的包?

请注意,至少从 2017 年 3 月 30 日开始(对应于 17.03 Nix/NixOS channel/release),据我了解官方的、现代的、受支持的和建议的解决方案是使用 so称为 叠加层

请参阅 nixpkgs 手册中的 the chapter titled "Overlays" 以获得有关如何使用新方法的很好的指南。

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

self: super:
{
  boost = super.boost.override {
    python = self.python3;
  };
  rr = super.callPackage ./pkgs/rr {
    stdenv = self.stdenv_32bit;
  };
}
  • super 组对应于 "old" 组软件包(在应用覆盖之前)。如果你想引用旧版本的包(如上面的boost),或者callPackage,你应该通过super.

    [=71=引用它]
  • self组对应最终的"future"组包,表示应用所有叠加层后的最终结果。 (注意:有时使用它们可能会被 Nix 拒绝,请不要害怕,因为这会导致无限递归。在这些情况下,您可能应该只使用 super。)

注意:通过上述更改,我在下面的原始答案中提到的解决方案现在似乎 "deprecated" — 我相信它应该在 2017 年 4 月之前仍然有效,但我不知道多长时间。出现marked as "obsolete" in the nixpkgs repository.



旧答案,17.03 之前:

假设您想要同步应用程序每个用户(因为非 NixOS Nix 保持应用程序可见 ,据我所知), 可以以声明的方式进行。它只是在手册中没有得到很好的宣传——尽管它在长期的 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 中,您可以像在 NixOS 上的 /etc/nixos/configuration.nix 中那样以类似的方式放置内容。另外,home 在这里实际上是一个 "fake package"。您可以在其旁边添加更多自定义包定义,然后将它们包含在您的 "paths".

(旁注:我希望写一篇博客post,其中包含我学到的关于它究竟是如何工作的知识,并展示如何扩展它更多定制。如果我成功了,我会尽量记住 link。)