4

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

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

4

1 回答 1

9

请注意,至少自 30.03.2017(对应于 17.03 Nix/NixOS 频道/版本)以来,据我所知,官方、现代、支持和建议的解决方案是使用所谓的overlays

请参阅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 年 4 月仍然有效,但我不知道多久。它在 nixpkgs 存储库中显示为“已过时”



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

你可以像在NixOS 上paths一样以类似的方式放入东西。/etc/nixos/configuration.nix还有,home这里其实是一个“假包”。您可以在其旁边添加更多自定义包定义,然后将它们包含在您的“路径”中。

(旁注:我希望写一篇博文,讲述我所学到的关于它是如何工作的,并展示如何通过更多的自定义来扩展它。如果我成功了,我会尽量记住在此处链接它。)

于 2016-07-21T18:17:15.940 回答