【问题标题】:How can I use a nix configuration when not using Nixos?不使用 Nixos 时如何使用 nix 配置?
【发布时间】:2018-01-07 02:52:31
【问题描述】:

所以我已经在 Arch linux 上安装了 Nix,我可以运行 nix-env -i example,但是如何定义 Nix 配置?

因为我没有任何/nixos/configuration.nix 文件。

这可能吗?


我的目标是能够定义一个配置,然后我可以使用 nixos-rebuild switch 之类的东西来安装和配置所有软件。

【问题讨论】:

标签: nix nixos


【解决方案1】:

我使用 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 中,无论如何下次部署时它都会被删除。

【讨论】:

    【解决方案2】:

    您当然可以创建自己的配置。例如,您可以这样做:

    let
        pkgs = import <nixpkgs> {};
    in
        {    
            packages = [
                pkgs.vim
                pkgs.gimp
            ];
        }
    

    这将产生一个集合,其中包含一个名为packages 的属性,其中包含一个 Nix 包列表。但是,您需要开发一个工具来从中构建环境,这是nix-env 所做的一部分。例如,该工具可以使用nix-env 来确定已安装的内容,将其与配置中选择的包进行比较,然后相应地安装/卸载包。

    您没有/etc/nixos/configuration.nix,因为那是 NixOS 特有的。因此,虽然您可以按照您的要求做,但您必须推出自己的解决方案。

    【讨论】:

    • 我想如果我不使用任何服务,我可以挂载一个 Nixos 文件系统并 chroot 进去?否则我可能会尝试在 Docker 容器中执行此操作。
    • 可能......但这变得非常复杂。如果您只想批量安装软件包,您可以一次将它们全部输入nix-env,然后使用它的升级功能一次升级所有软件包。这样,回滚将撤消升级整个包集,就像在 NixOS 上一样。如果 Arch Linux 设置为使用 systemd,那么您可以在来自 NixOS(或任何其他配备 systemd 的操作系统)的 systemd-nspawn 容器中“启动”它。
    猜你喜欢
    • 2019-11-22
    • 2016-12-05
    • 1970-01-01
    • 2022-08-20
    • 2015-05-18
    • 2020-11-08
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多