假设我搜索要安装的包,使用nix-env
的--query
手术:
$ nix-env -qa 'aspell.*en'
aspell-dict-en-7.1-0
我把这个包名写在/etc/nixos/configuration.nix
NixOS的main中配置文件:
environment.systemPackages = with pkgs; [
aspell-dict-en
];
然而,如果我运行sudo nixos-rebuild switch
,NixOS 命令更新配置并安装由指定的所有系统范围的软件包声明式地,它会因错误而中止:
error: undefined variable ‘aspell-dict-en’ at /etc/nixos/configuration.nix:44:5
我知道对于许多包(虽然不是全部),返回的名称nix-env
和应在配置选项中指定的名称environment.systemPackages
是不同的,但我不明白其中的逻辑。如何安装通过 找到的软件包nix-env
?
答案1
NixOS 社区有三本手册,如果您遇到困难,请务必先查阅它们:
- 尼克斯手册,对于包管理器
- NixOS 手册,对于操作系统
- Nixpkgs 手册,用于 Nix 包基础设施
Nix 上的每个包都由 Nix 表达式指定。 Nix 表达式是用 Nix 语言编写的一些文本,通常驻留在扩展名为.nix
.
每个表达式都有所谓的“符号名称”,当您使用nix-env
.看Nix 表达式示例。 Nix 本身不会在内部任何地方使用这个符号名称,所以你的包是否被命名并不重要aspell-dict-en
,这只是为了你,人类的方便。
真正重要的是所谓的“属性路径”。所以你的困惑在于符号名称和属性路径之间。每个包都有一个属性路径,您可以在environment.systemPackages
配置选项中使用它来在系统范围内安装声明式包管理。
要找出包的属性路径,请添加另一个标志-P
您的查询:
$ nix-env -qaP 'aspell.*en'
nixos.aspellDicts.en aspell-dict-en-7.1-0
您应该能够轻松地nix-env
每天使用,因此请练习nix-env
使用--query
和--install
选项进行呼叫。但是,您也可以在线浏览包并查找其属性路径Nix 软件包搜索。输入aspell
,单击aspell-dict-en
,您将看到各种软件包的属性,包括作为安装命令一部分的属性路径:
$ nix-env -iA nixos.pkgs.aspellDicts.en
现在您可以将此属性路径放入/etc/nixos/configuration.nix
:
environment.systemPackages = with pkgs; [
aspellDicts.en
];
然后通过运行更新系统sudo nixos-rebuild switch
。
答案2
您可以使用以下网站搜索软件包:
如果您使用 NixOS 进行数据科学:
Python模块:
nix-env -qaP .\*pylint.\*
或者
py_pkgs="nix_packages_py35.txt"
nix-env -qaP | grep -i python36 > ${py_pkgs}
grep pandas ${py_pkgs}
或者如果您正在特别寻找右包/库
nix-env -f "<nixpkgs>" -qaP -A rPackages .\*tidyverse.\*
或者你可以得到例如 npm 包:
nix-env -qaPA 'nixos.nodePackages'
答案3
nix-env -v -qaP '*' | grep "nvim"
我会将结果保存nix-env -v -qaP '*'
到文件中(因为通常需要一段时间才能返回)。
请记住,nix-env 似乎忽略了下面的内容haskellPackages
(也可能忽略其他内容)。您可以通过以下方式搜索子类别中的包,例如 haskellPackages
nix-env -f '<nixpkgs>' -qaPA haskellPackages
nix-env 搜索目前非常令人沮丧,因为它需要 5 秒以上的时间,然后返回error: regex error
......
答案4
nix-search () {
local cache_file=~/.cache/nix/nix-env-qaP
if [[ "$1" =~ ^--?c(ache)?$ ]]; then
mkdir -p $(dirname $cache_file)
echo -n "Caching packages.."
nix-env -qaP '*' >$cache_file
echo "