How to find the name of a Nix package to install it in configuration.nix

nixnixos

Suppose I search for a package to install using nix-env's --query operation:

$ nix-env -qa 'aspell.*en'
aspell-dict-en-7.1-0

I write this package name in /etc/nixos/configuration.nix, NixOS's main configuration file:

environment.systemPackages = with pkgs; [
  aspell-dict-en
];

Yet if I run sudo nixos-rebuild switch, NixOS command to update the configuration and install all system-wide packages specified by declaratively, it aborts with an error:

error: undefined variable ‘aspell-dict-en’ at /etc/nixos/configuration.nix:44:5

I know that for many packages, although not all, the name that nix-env returns and the name one should specify in environment.systemPackages configuration option are different, but I don't understand the logic. How do I install a package that I found through nix-env?

Best Answer

NixOS community has three manuals, always consult them first, if you're stuck:

Every package on Nix is specified by a Nix expression. A Nix expression is some text, written in Nix language, typically residing in a file with extension .nix.

Every expression has the so-called “symbolic name”, a human-readable name that is printed, when you use nix-env. See sample Nix expression. Nix itself doesn't use this symbolic name anywhere internally, so it doesn't matter if your package is named aspell-dict-en, it's just for your, human's, convenience.

What actually matters is the so-called “attribute path”. So your confusion is between symbolic name and attribute path. Every package has an attribute path, which you can use in environment.systemPackages configuration option to install system-wide using declarative package management.

To find out your package's attribute path, add another flag -P to your query:

$ nix-env -qaP 'aspell.*en'
nixos.aspellDicts.en  aspell-dict-en-7.1-0

You should be comfortable using nix-env on a daily basis, so practice calling nix-env with --query and --install options. However you can also browse packages and find out their attribute paths online on Nix packages search. Type aspell, click on aspell-dict-en and you'll see various package's properties, including attribute path as part of the install command:

$ nix-env -iA nixos.pkgs.aspellDicts.en

Now you can put this attribute path into /etc/nixos/configuration.nix:

environment.systemPackages = with pkgs; [
  aspellDicts.en
];

Then update the system by running sudo nixos-rebuild switch.