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

Ign*_*rov 3 nix

nix在 Linux 系统上安装了,并添加了频道nixpkgs-unstable。我现在可以安装软件包,例如gcc

% nix-env --install gcc
installing 'gcc-7.4.0'
...
created 78 symlinks in user environment
Run Code Online (Sandbox Code Playgroud)

如果我看着如目录~/.nix-defexpr/channels/nixpkgs/pkgs/development/compilers/gcc/,我会发现,有多种版本,全部完成default.nix

  • 如何使用ghc-env --query或其他一些友好工具发现这些隐藏的软件包版本?

  • 假设我想在gcc我的用户环境中安装版本 8,我应该怎么做?我可以一次获得多个版本gcc吗?

我一直在浏览 Nix 的大量文档,但到处都在说“使用 Nix,你可以一次安装任意数量的版本,它们永远不会发生冲突”,同时“你应该只安装一次一个版本,在您选择的频道中进行硬编码”。它有什么意义?

小智 6

您可以从这里查看软件包的所有过去版本以及如何安装它们https://lazamar.co.uk/nix-versions

Nix 仅在派生中保留包的最新版本。如果多个主要版本流行(如 python2 和 python3),将列出每个版本的最新版本。

不幸的是,nix 没有一种本地方式来搜索过去在以前的派生中可用的包的所有版本。

我编写了链接来解决这个问题的工具。

  • 这是一个非常有用的资源。我感到惊讶的是它不是官方 NixOS 基础设施的一部分。 (5认同)

Vla*_*nát 0

我建议使用属性路径,例如nix-env -iA nixpkgs.gcc8在您的情况下,“nixpkgs”是因为您以这种方式命名您的频道(NixOS 用户通常会使用“nixos”名称)。属性路径是明确的,与正常名称相反。

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

旁注:

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