如何发现并安装特定版本的软件包?

如何发现并安装特定版本的软件包?

我在 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”名称)。属性路径是明确的,与正常名称相反。

如何发现这些?一种方法是例如添加-Pnix-env -qa查询中。我通常使用制表符补全nix repl或浏览all-packages.nix文件:-)(除非我知道或尝试猜测 attrpath)

旁注:

  • 如果您尝试一次在单个配置文件中拥有多个版本(例如通过nix-env),那么在创建配置文件的符号链接树时通常会发生冲突,除非您设置优先级。
  • 在单通道版本(即 nixpkgs commit)内,我们尝试将每个包的版本和配置数量保持在最低限度,通常只有一个。这是出于节省资源(构建和分发二进制文件)和更好的质量/维护的动机。

相关内容