【发布时间】:2018-06-11 17:09:25
【问题描述】:
我只使用Nix 作为包管理器,而不是使用所有NixOS。我想要一个可复制的nix-env -i 软件包安装,可以共享和备份。
我知道将config.nix 用于NixOS,但我正在寻找仅使用Nix 包的类似功能。
【问题讨论】:
标签: nix
我只使用Nix 作为包管理器,而不是使用所有NixOS。我想要一个可复制的nix-env -i 软件包安装,可以共享和备份。
我知道将config.nix 用于NixOS,但我正在寻找仅使用Nix 包的类似功能。
【问题讨论】:
标签: 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
【讨论】: