<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-ad-hoc-packages">
  <title>Ad-Hoc Package Management</title>
  <para>
    With the command <literal>nix-env</literal>, you can install and
    uninstall packages from the command line. For instance, to install
    Mozilla Thunderbird:
  </para>
  <programlisting>
$ nix-env -iA nixos.thunderbird
</programlisting>
  <para>
    If you invoke this as root, the package is installed in the Nix
    profile <literal>/nix/var/nix/profiles/default</literal> and visible
    to all users of the system; otherwise, the package ends up in
    <literal>/nix/var/nix/profiles/per-user/username/profile</literal>
    and is not visible to other users. The <literal>-A</literal> flag
    specifies the package by its attribute name; without it, the package
    is installed by matching against its package name (e.g.
    <literal>thunderbird</literal>). The latter is slower because it
    requires matching against all available Nix packages, and is
    ambiguous if there are multiple matching packages.
  </para>
  <para>
    Packages come from the NixOS channel. You typically upgrade a
    package by updating to the latest version of the NixOS channel:
  </para>
  <programlisting>
$ nix-channel --update nixos
</programlisting>
  <para>
    and then running <literal>nix-env -i</literal> again. Other packages
    in the profile are <emphasis>not</emphasis> affected; this is the
    crucial difference with the declarative style of package management,
    where running <literal>nixos-rebuild switch</literal> causes all
    packages to be updated to their current versions in the NixOS
    channel. You can however upgrade all packages for which there is a
    newer version by doing:
  </para>
  <programlisting>
$ nix-env -u '*'
</programlisting>
  <para>
    A package can be uninstalled using the <literal>-e</literal> flag:
  </para>
  <programlisting>
$ nix-env -e thunderbird
</programlisting>
  <para>
    Finally, you can roll back an undesirable <literal>nix-env</literal>
    action:
  </para>
  <programlisting>
$ nix-env --rollback
</programlisting>
  <para>
    <literal>nix-env</literal> has many more flags. For details, see the
    nix-env(1) manpage or the Nix manual.
  </para>
</section>
