Had the same question so putting it here too in case it helps:
TL;DR
Are you on the latest channel?
(See how to check and set below.)
sudo nix-channel --updatea. (declarative/NixOS)
sudo nixos-rebuild switch
b. (ad-hoc)nix-env -u '*'
c. (Home Manager)home-manager switch(I think)These steps should work regardless of using NixOS or not.
NOTE: Don’t know how flakes work, but it’s a fairly good bet that this won’t work with them.
Step 0. Check and set the latest channel
Step 1.'s
nix-channel --updatewill only pull the changes in the channel that is currently set! To check the current one you are subscribed to, issuesudo nix-channel --listThe latest NixOS manual’s Chapter 4. Upgrading NixOS will always show the name and the link of the latest channel. The Nix Channel Status page is also a very good resource.
For example, I was subscribed to channel
20.09so I needed to update it to21.11by doing$ 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 nixosMore info:
The Nix manual’s 4.4 Channels section is a short intro to Nix channels.
The NixOS wiki’s Nix channels article goes more into the details and has a good summary on the basic commands. (Personally, I found this one more useful.)
Step 1. Update the channel
This is required both for declarative and “ad-hoc” [sic] setups3:
sudo nix-channel --updateEven though the Nix manual has a 4.1 Basic Package Management section, it is best documented in the NixOS manual (see Chapter 7. Package Management). (Albeit, I didn’t find it straightforward figuring out the correct order of steps from these; the biggest help was this NixOS discourse thread.)
Home Manager does not seem to complicate this process. (At least, I’m using it on NixOS, and
nixos-rebuild switchalways takes care of everything with my setup.)TIP FOR NIXOS USERS
Thenixos-rebuild switch --upgradecombines Step 1. and Step 2. as it “is equivalent to the more verbosenix-channel --update nixos; nixos-rebuild switch”.Step 2. Update the packages
The two adjectives, “ad-hoc” [sic] and “declarative”, are introduced in the NixOS manual to differentiate the two modes of Nix package management3:
“ad-hoc”: Managing packages with
nix-env.1“declarative”: In the NixOS manual, this refers to declaring packages as a list in NixOS’
configuration.nix, but it can be done in many other ways2.The commands:
a. To update all packages declared in NixOS’
configuration.nix, use:sudo nixos-rebuild switchb. To update all packages installed with
nix-env:nix-env -u '*'c. To update all packages installed using Home Manager:
home-manager switch(I think. Again, I’m using Home Manager in NixOS, and never had to touch any Home Manager commands. See Home-manager equivalent of “apt upgrade”)
Footnotes
[1]: As far as I know, the NixOS manual is the only official document that uses the term “ad-hoc [sic] package management” and only to mean package management using
nix-env.(Therefore I find the term misleading, because using packages via
nix-shell -pcommands or customshell.nix-es are also ad hoc forms of package management. Also,nix-envcan be messy.)[2]: For example with Home Manager, using
shell.nix-es, flakes. (It is probably incorrect to list flakes, as it is a mechanism that can be used with Home Manager and nix-shell Nix expressions…)[3]: Not sure if there is a consensus what “ad-hoc”, “declarative”, and “imperative” package management means in Nix; footnote 1 has my thoughts about “ad-hoc”, some say that using channels is always an imperative form of package management, so “declarative” seems to be overloaded…