Как мне выполнить поиск пакетов Haskell с помощью «nix search»?

#haskell #nix

#haskell #nix

Вопрос:

Я знаю, что могу выполнить поиск пакетов Haskell с помощью nix-env, используя

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

но это происходит медленно и не кэшируется. Если я попытаюсь использовать новую команду nix search , все пакеты Haskell будут скрыты.

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

Возможно ли выполнить поиск пакетов Haskell с помощью новой nix search команды? Если да, то каким образом?


Редактировать: я нашел некоторое обсуждение этого в этом журнале irc, но я не совсем понял, что эти предложения будут означать на практике. В частности, эта часть:

 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)
  

Ответ №1:

Согласно IRC-чату, создайте ~/.config/nixpkgs/overlays.nix файл, содержащий это:

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

Это наложение, которое устанавливает для recurseForDerivations атрибута haskellPackages значение true. recurseForDerivations сообщает инструментам nix для обхода набора, которые выполняют поиск в нем в случае nix search . В настоящее время это недокументировано, но реализовано здесь.

В Nix wiki описано, куда поместить оверлей, а в руководстве Nixpkgs описано, что на самом деле представляют собой оверлеи и как их использовать.

Комментарии:

1. Спасибо! Да, похоже, это именно то, что мне нужно. Однако, чтобы это сработало, мне нужно было поместить его после любых других изменяемых наложений haskellPackages . Не уверен, почему.

Ответ №2:

Вы могли бы сохранить результат этого:

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

И вместо этого каждый раз выполнять поиск по этому результату?

Я думаю, что проблема в том, что <nixpkgs> нужно будет оценивать при каждом вызове, однако, если бы это был статический файл / путь — в этом не было бы необходимости.

Комментарии:

1. Да, это улучшение. Однако я надеялся, что для этого можно использовать новую команду fancy nix search , и из журнала IRC, на который я ссылался, у меня сложилось впечатление, что это возможно. Я просто не понимаю, как.