如何更新 NixOS 上的每个软件包?

tor*_*tte 15 nixos

几个月前终于弄清楚如何设置我的系统,从那时起就一直愉快地使用它们,但意识到是时候更新东西了。我的 NixOS 设置涉及使用Home Manager进行声明式包管理,但完全忘记了基础知识,并且不确定 Home Manager 是否会使事情变得复杂,因为存储库提到了我没有的工具。home-manager

tor*_*tte 21

长话短说

\n
    \n
  1. 你在最新的频道吗?
    \n(查看和设置方法见下文。)

    \n
  2. \n
  3. sudo nix-channel --update

    \n
  4. \n
  5. A。(声明式/NixOS)\nb。\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0(临时)\nc。\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0(家庭管理员)(我认为sudo nixos-rebuild switch
    nix-env -u \'*\'
    home-manager switch

    \n
  6. \n
\n

无论是否使用 NixOS,这些步骤都应该有效。

\n

注意-1(薄片):如果您使用薄片,那么这一切都不起作用,这是一个相当不错的赌注。

\n

注意 2(NixOS + Home Manager):如果nixos-rebuild switch失败并出现神秘的错误消息,请查看您的 Home Manager 配置。至少,在过去的 5 年里,每当错误不明确时(例如,nix.maxJobs已弃用,取而代之nix.settings.max-jobs),总是与 Home Manager 有关。

\n

步骤0.查看并设置最新频道

\n

第 1 步只会提取当前设置的nix-channel --update通道中的更改!要检查您当前订阅的内容,请发出

\n
sudo nix-channel --list\n
Run Code Online (Sandbox Code Playgroud)\n

最新的NixOS手册的第4章升级NixOS将始终显示最新频道的名称和链接。Nix频道状态页面也是一个非常好的资源。

\n

例如,我订阅了频道20.09,所以我需要21.11通过执行以下操作将其更新为

\n
$ sudo nix-channel --list\nnixos https://nixos.org/channels/nixos-20.09\n\n$ sudo nix-channel --remove nixos\n$ sudo nix-channel --add https://nixos.org/channels/nixos-21.11 nixos\n
Run Code Online (Sandbox Code Playgroud)\n

更多信息:

\n
    \n
  • Nix 手册的4.4 通道部分是对 Nix 通道的简短介绍。

    \n
  • \n
  • NixOS wiki 的Nix 通道文章更详细地介绍了细节,并对基本命令进行了很好的总结。(就我个人而言,我发现这个更有用。)

    \n
  • \n
\n

步骤 1. 更新频道

\n

这对于声明性和“临时”[原文如此]设置3都是必需的:

\n
sudo nix-channel --update\n
Run Code Online (Sandbox Code Playgroud)\n

尽管 Nix 手册有4.1 基本包管理部分,但最好在 NixOS 手册中进行记录(请参阅第 7 章包管理)。(尽管如此,我并没有发现直接从这些步骤中找出正确的步骤顺序;最大的帮助是这个 NixOS 讨论线程。)

\n

Home Manager 似乎并没有使这个过程复杂化。(至少,我在 NixOS 上使用它,并且总是通过我的设置nixos-rebuild switch处理所有事情。)

\n
\n

NIXOS 用户提示
\nnixos-rebuild switch --upgrade结合了步骤 1. 和步骤 2.,因为它“相当于更详细的nix-channel --update nixos; nixos-rebuild switch”。

\n
\n

步骤 2. 更新软件包

\n

NixOS 手册中引入了两个形容词“ad-hoc”[原文如此]和“声明性”来区分 Nix 包管理的两种模式3

\n
    \n
  • ad-hoc ”:使用nix-env. 1

    \n
  • \n
  • 声明式”:在NixOS 手册中,这指的是在 NixOS 中将包声明为列表configuration.nix,但也可以通过许多其他方式来完成2

    \n
  • \n
\n

命令:

\n

A。要更新 NixOS\' 中声明的所有包configuration.nix,请使用:

\n
sudo nixos-rebuild switch\n
Run Code Online (Sandbox Code Playgroud)\n

b. 要更新所有安装的软件包nix-env

\n
nix-env -u \'*\'\n
Run Code Online (Sandbox Code Playgroud)\n

C。要更新使用 Home Manager 安装的所有软件包:

\n
home-manager switch\n
Run Code Online (Sandbox Code Playgroud)\n

(我想。同样,我在 NixOS 中使用 Home Manager,并且从未接触过任何 Home Manager 命令。请参阅Home-manager 相当于 \xe2\x80\x9capt update\xe2\x80\x9d

\n
\n

脚注

\n

[1]:据我所知,NixOS 手册是唯一使用术语“ad-hoc [原文如此]包管理”的官方文档,并且仅表示使用nix-env.

\n

(因此,我发现这个术语具有误导性,因为通过nix-shell -p命令或自定义shell.nix-es 使用包也是包管理的临时形式。而且,nix-env可能会很混乱。)

\n

[2]:例如使用 Home Manager,使用shell.nix-es、flakes。(列出 flake 可能是不正确的,因为它是一种可以与 Home Manager 和 nix-shell Nix 表达式一起使用的机制......)

\n

[3]:不确定 Nix 中“临时”、“声明式”和“命令式”包管理的含义是否达成共识;脚注1有我对“ad-hoc”的想法,有人说使用通道始终是包管理的命令式形式,所以“声明式”似乎超载了......

\n