haskellnixnix-flake

How do I search for Haskell packages using "nix search"?


I know that I can search for Haskell packages with nix-env by using

nix-env -f '<nixpkgs>' -qaP -A haskellPackages name_of_package

but that is slow and uncached. If I try to use the new command nix search all the Haskell packages are hidden.

$ nix search aeson
error: no results for the given search term(s)!

Is it possible to search for Haskell packages using the new nix search command? If so, how?


Edit: I found some discussion about this in this irc log, but I couldn't quite grasp what the suggestions would mean in practice. Specifically this part:

20:49 <duairc> How do I make nix search include haskellPackages?
20:52 <ottidmes> duairc: you might try and call recurseIntoAttrs on haskellPackages
20:52 <rain1> thanks
20:52 <LnL> rain1: nix-env -f '<nixpkgs>' -qaP -A haskellPackages
20:54 <gchristensen> duairc: ^
20:54 <duairc> LnL: Thanks!
20:55 <LnL> err, wrong person
20:56 <LnL> you can also add an overlay that recurses, but that might make it
      hard to find non haskell stuff if you're searching for something else
20:56 <ottidmes> I can confirm that
      haskellPackages = super.recurseIntoAttrs super.haskellPackages; works though
20:58 <duairc> ottidmes: What do I do with that expression? Put it in
      configuration.nix somewhere? If I type "nix search ghcid" then
      will it find it?
20:59 <duairc> Ah, you're using super, so I guess it's an overlay
20:59 <clever> duairc: for `nix search` to find it, the overlay must be
      somewhere in $HOME, i forget the exact path
20:59 <clever> duairc: configuration.nix only effects nixos-rebuild and
      nothing else
21:00 <ottidmes> duairc: yeah, it should be put in your overlay that is
      also used by nix-env the like, so not nixpkgs.overlays in your
      configuration.nix as mentioned by clever, and then searching
      for e.g. nix search nix-diff will result in:
      * nixpkgs.haskellPackages.nix-diff (nix-diff)

Solution

  • As per the IRC chat, create a ~/.config/nixpkgs/overlays.nix file containing this:

    [
      (self: super: {
        haskellPackages = super.recurseIntoAttrs super.haskellPackages;
      })
    ]
    

    This is an overlay that sets the recurseForDerivations attribute of the haskellPackages set to true. recurseForDerivations tells nix tools to traverse the set, which searches it in the case of nix search. It is currently undocumented, but implemented here.

    The Nix wiki describes where to put the overlay and the Nixpkgs manual describes what overlays actually are and how to use them.