我在 Linux 系统上安装了nix
,并且添加了频道nixpkgs-unstable
。我现在可以安装以下软件包gcc
:
% nix-env --install gcc
installing 'gcc-7.4.0'
...
created 78 symlinks in user environment
如果我查看诸如 之类的目录~/.nix-defexpr/channels/nixpkgs/pkgs/development/compilers/gcc/
,我会发现有多种版本,全部以default.nix
.
我如何使用
ghc-env --query
或其他一些友好的工具发现这些隐藏的软件包版本?假设我希望将
gcc
版本 8 安装到我的用户环境中,我应该如何操作?我可以gcc
一次获取多个版本吗?
我一直在浏览 Nix 的大量文档,但他们到处都说了类似的内容“使用 Nix,您可以一次安装任意数量的版本,并且它们永远不会发生冲突”同时“您应该一次只安装一个版本,该版本是硬编码在您选择的频道中的”。这有什么意义呢?
答案1
您可以从这里查看软件包的所有过去版本以及如何安装它们https://lazamar.co.uk/nix-versions
Nix 仅在派生中保留最新版本的包。如果有多个主要版本流行(例如 python2 和 python3),则会列出每个版本的最新版本。
不幸的是,nix 没有一种本地方法来搜索以前的派生中过去可用的包的所有版本。
我编写了链接的工具来解决这个问题。
答案2
我建议使用属性路径,例如nix-env -iA nixpkgs.gcc8
在您的情况下,“nixpkgs”是因为您以这种方式命名您的频道(NixOS 用户通常会使用“nixos”名称)。属性路径是明确的,与正常名称相反。
如何发现这些?一种方法是例如添加-P
到nix-env -qa
查询中。我通常使用制表符补全nix repl
或浏览all-packages.nix
文件:-)(除非我知道或尝试猜测 attrpath)
旁注:
- 如果您尝试一次在单个配置文件中拥有多个版本(例如通过
nix-env
),那么在创建配置文件的符号链接树时通常会发生冲突,除非您设置优先级。 - 在单通道版本(即 nixpkgs commit)内,我们尝试将每个包的版本和配置数量保持在最低限度,通常只有一个。这是出于节省资源(构建和分发二进制文件)和更好的质量/维护的动机。