我知道使用 NixOS,您可以简单地复制configuration.nix
文件以同步您的操作系统状态,包括在机器之间安装的包。
那么,是否有可能在非 NixOS 操作系统上使用包管理器 Nix 来仅同步已安装的包?
我知道使用 NixOS,您可以简单地复制configuration.nix
文件以同步您的操作系统状态,包括在机器之间安装的包。
那么,是否有可能在非 NixOS 操作系统上使用包管理器 Nix 来仅同步已安装的包?
请注意,至少自 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
这里其实是一个“假包”。您可以在其旁边添加更多自定义包定义,然后将它们包含在您的“路径”中。
(旁注:我希望写一篇博文,讲述我所学到的关于它是如何工作的,并展示如何通过更多的自定义来扩展它。如果我成功了,我会尽量记住在此处链接它。)