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

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

几个月前我终于搞清楚了如何设置我的系统,从那以后我一直很开心地使用它们,但我意识到是时候更新一些东西了。我的 NixOS 设置包括声明式包管理使用家庭经理,但完全忘记了基础知识,并且不确定 Home Manager 是否会使事情变得复杂,因为回购仅提到home-manager我没有的工具。

答案1

总结

  1. 您在最新频道上吗?
    (请参阅下面的如何检查和设置。)

  2. sudo nix-channel --update

  3. a. (声明式/NixOS)sudo nixos-rebuild switch
    b. (临时)nix-env -u '*'
    c. (家庭经理)home-manager switch我认为

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

注-1 (薄片): 如果您使用的是薄片,那么可以肯定的是,这些都不会起作用。

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

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

步骤 1.nix-channel --update只会拉取通道中的更改目前设置! 要检查您当前订阅的版本,请发出

sudo nix-channel --list

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

例如,我订阅了频道,因此我需要通过以下方式20.09更新它21.11

$ sudo nix-channel --list
nixos https://nixos.org/channels/nixos-20.09

$ sudo nix-channel --remove nixos
$ sudo nix-channel --add https://nixos.org/channels/nixos-21.11 nixos

更多信息:

  • Nix 手册4.4 渠道部分是对 Nix 频道的简短介绍。

  • NixOS wiki 的尼克斯通道这篇文章更详细,对基本命令进行了很好的总结。(就我个人而言,我发现这篇文章更有用。)

步骤 1. 更新频道

这对于声明式和“临时”设置都是必需的3

sudo nix-channel --update

尽管 Nix 手册中有4.1 基本包管理部分,最好在 NixOS 手册中记录(参见第 7 章 软件包管理)。(尽管我发现从这些步骤中找出正确的顺序并不容易;最大的帮助是这个 NixOS 讨论帖

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

NIXOS 用户提示
nixos-rebuild switch --upgrade步骤 1 和步骤 2 合并为“相当于更详细的nix-channel --update nixos; nixos-rebuild switch“。

第 2 步. 更新软件包

这两个形容词“ad-hoc”和“declarative”是在NixOS 手册区分 Nix 包管理的两种模式3

  • 特别指定":使用 管理包nix-env1

  • 声明式“: 在里面NixOS 手册,这指的是在 NixOS 中将包声明为列表'configuration.nix,但还有很多其他方法可以实现2

命令:

a. 要更新 NixOS 中声明的所有软件包configuration.nix,请使用:

sudo nixos-rebuild switch

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

nix-env -u '*'

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

home-manager switch

(我想。再说一次,我在 NixOS 中使用 Home Manager,从来没有接触过任何 Home Manager 命令。请参阅家居管理相当于“公寓升级”


脚注

[1]:据我所知,NixOS 手册是唯一使用术语“临时包管理”且仅表示使用 进行包管理的官方文档nix-env

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

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

[3]:不确定在 Nix 中,是否存在关于“ad-hoc”、“声明式”和“命令式”包管理的共识;脚注 1 是我对“ad-hoc”的看法,有人说使用渠道始终是包管理的必要形式,因此“声明性”似乎被超载了......

相关内容