【发布时间】:2018-01-07 02:52:31
【问题描述】:
所以我已经在 Arch linux 上安装了 Nix,我可以运行 nix-env -i example,但是如何定义 Nix 配置?
因为我没有任何/nixos/configuration.nix 文件。
这可能吗?
我的目标是能够定义一个配置,然后我可以使用 nixos-rebuild switch 之类的东西来安装和配置所有软件。
【问题讨论】:
所以我已经在 Arch linux 上安装了 Nix,我可以运行 nix-env -i example,但是如何定义 Nix 配置?
因为我没有任何/nixos/configuration.nix 文件。
这可能吗?
我的目标是能够定义一个配置,然后我可以使用 nixos-rebuild switch 之类的东西来安装和配置所有软件。
【问题讨论】:
我使用 NixOS,但我使用/etc/nixos/configuration.nix 来描述我的系统;我将其保持在最低限度,并且不喜欢通过编辑 configuration.nix 来安装“用户”软件。
所以我要做的是使用我的~/.nixpkgs/config.nix(我相信即使在非 NixOS 的 nix 安装中你也有类似的东西?我从未真正单独使用过 nix)。
我使用的基本结构是这样的:
{
packageOverrides = nixpkgs: with nixpkgs; rec {
mine = with pkgs; buildEnv {
name = "mine";
paths = [
# your packages here
];
};
};
}
buildEnv 是来自 nix 的一个便利函数,它可以从一堆其他的包中创建一个“环境”包;安装包mine 取决于(并因此安装)paths 中列出的所有内容,并确保它们包含在PATH 等类似内容中。
然后我只需使用nix-env -riA nixos.mine 来部署我对环境描述所做的更改(或在频道更新后重建我的环境)。 -r 告诉它从我的新一代配置文件中删除除mine 以外的所有其他内容,这意味着我可以(ab?)使用nix-env -i some-package 作为“临时”安装some-package 的一种方式,如果我不要决定我是否足够喜欢它以将其实际记录在我的 config.nix 中,无论如何下次部署时它都会被删除。
【讨论】:
您当然可以创建自己的配置。例如,您可以这样做:
let
pkgs = import <nixpkgs> {};
in
{
packages = [
pkgs.vim
pkgs.gimp
];
}
这将产生一个集合,其中包含一个名为packages 的属性,其中包含一个 Nix 包列表。但是,您需要开发一个工具来从中构建环境,这是nix-env 所做的一部分。例如,该工具可以使用nix-env 来确定已安装的内容,将其与配置中选择的包进行比较,然后相应地安装/卸载包。
您没有/etc/nixos/configuration.nix,因为那是 NixOS 特有的。因此,虽然您可以按照您的要求做,但您必须推出自己的解决方案。
【讨论】:
nix-env,然后使用它的升级功能一次升级所有软件包。这样,回滚将撤消升级整个包集,就像在 NixOS 上一样。如果 Arch Linux 设置为使用 systemd,那么您可以在来自 NixOS(或任何其他配备 systemd 的操作系统)的 systemd-nspawn 容器中“启动”它。