可重现的 nix-env -i 只有 Nix,没有 NixOS

Reproducible nix-env -i with only Nix, no NixOS

我只使用 Nix 作为包管理器,并没有使用所有 NixOS。我想要一个可以共享和备份的可重现 nix-env -i 包安装。

我知道 config.nix 用于 NixOS,但我正在寻找与 Nix 包类似的功能。

从 Nixpkgs 中,您可以使用 buildEnv 函数构建符号链接场,类似于 nix-env 生成它们的方式。

这让您可以将软件包分组到您想要单独更新的组中。当然,如果适合您的应用程序,单个组是完全有效的。

这是一个例子greeting-tools.nix:

let
  pkgs = import <nixpkgs> {};
  inherit (pkgs) buildEnv;

in buildEnv {
  name = "greeting-tools";
  paths = [ pkgs.hello pkgs.cowsay pkgs.figlet ];
}

您可以按如下方式安装和删除

$ nix-env -i -f greeting-tools.nix
installing 'greeting-tools'
$ hello
Hello, world!
$ nix-env -e greeting-tools
uninstalling 'greeting-tools'
$ hello
The program ‘hello’ is currently not installed. [...]

要更新您的软件包,您必须重新运行 安装命令。 nix-env -u 将无法正常工作,因为它只查看 Nixpkgs,可能 没有类似的名称。

备选方案可能是 home manager

我还是新手,但发现 https://nixos.org/manual/nixpkgs/stable/#sec-building-environment 应该做的和被问到的完全一样。

例如里面 ~/.config/nixpkgs/config.nix

{
  packageOverrides = pkgs: with pkgs; {
    myPackages = pkgs.buildEnv {
      name = "greeting-tools";
      paths = [
        hello
        cowsay
        figlet
      ];
    };
  };
}

并通过 nix-env -iA nixpkgs.myPackages

安装

另一种方法是定义一个新的叠加层,例如在 ~/.config/nixpkgs/overlays/greeting-tools/default.nix:

self: super: {
  greetingTools = super.buildEnv {
    name = "greeting-tools";
    paths = [
      self.hello
      self.cowsay
      self.figlet
    ];
  };
}

然后可以像安装任何其他包一样安装:nix-env -i my-packages