Использование hoogle в среде разработки haskell на nix

Я пытаюсь использовать hoogle в среде разработки Haskell точно как тот, который описан Вики О'Чарлза:

Я изменил shell.nix как показано ниже, чтобы использовать hoogleLocal, но, похоже, он не устанавливает двоичный файл hoogle для меня.

let
  pkgs = import <nixpkgs> {};

  # I'm attempting to use hoogle here, but it is not working.
  haskellPackages =
    let callPackage = pkgs.lib.callPackageWith haskellPackages;
    in pkgs.recurseIntoAttrs (pkgs.haskellPackages.override {
      extension = self: super: {
        thiscurrentpackage = self.callPackage ./. {};
        hoogleLocal = pkgs.haskellPackages.hoogleLocal.override {
          packages = self.thiscurrentpackage;
        };
      };
    });
in pkgs.myEnvFun {
  name = haskellPackages.thiscurrentpackage.name;
  buildInputs = [
    (haskellPackages.ghcWithPackages (hs: ([
      hs.cabalInstall
      hs.ghcMod
      hs.yesodBin
      # This doesn't appear to install the hoogle binary?
      hs.hoogleLocal
    ] ++ hs.thiscurrentpackage.propagatedNativeBuildInputs)))
  ];
}

в результате "Шелл",hoogle двоичный файл недоступен.

если я включаю hs.hoogle до buildInputs на hoogle binary установлен, но он не может найти базы данных. Под что происходит, когда я пытаюсь использовать его.

$ nix-shell
......
$ hoogle Monad
Could not find some databases: default
Searching in:
  .
    /nix/store/91y9q2y5a2ws8xgcsx1gkhfagc0f2qz6-haskell-hoogle-ghc7.8.3-4.2.36-shared/share/x86_64-linux-ghc-7.8.3/hoogle-4.2.36/databases

    There are no available databases, generate them with: hoogle data
$ hoogle data
    hoogle: /nix/store/91y9q2y5a2ws8xgcsx1gkhfagc0f2qz6-haskell-hoogle-ghc7.8.3-4.2.36-shared/share/x86_64-linux-ghc-7.8.3/hoogle-4.2.36/databases:
changeWorkingDirectory: does not exist (No such file or directory)
$

как я могу заставить это работать правильно для настройки, как описано O'Charles?

редактировать: оригинальная оболочка.nix-это тот же самый из ответ.

2 ответов


вот как выглядит моя среда разработки Nix Haskell

на ~/.nixpkgs/config.nix:

вспомогательная функция окружающей среды

во-первых, определите функцию haskellEnvFun для построения сред Haskell:

packageOverrides = super: rec {

haskellEnvFun = { withHoogle ? false, compiler ? null, name }:
  let hp = if compiler != null
             then super.haskell.packages.${compiler}
             else haskellPackages;

      ghcWith = if withHoogle
                  then hp.ghcWithHoogle
                  else hp.ghcWithPackages;

  in super.buildEnv {
    name = name;
    paths = [(ghcWith myHaskellPackages)];
  };

определение некоторых средах

вызовите эту функцию, чтобы определить две среды: одну для запуска hoogle builder при изменениях, а другую без:

haskellEnvHoogle = haskellEnvFun {
  name = "haskellEnvHoogle";
  withHoogle = true;
};

haskellEnv = haskellEnvFun {
  name = "haskellEnv";
  withHoogle = false;
};

пакетов

определить все пакеты, которые вы хотите использовать в локальной среде Haskell dev:

myHaskellPackages = hp: with hp; [
  Boolean
  HTTP
  HUnit
  MissingH
  QuickCheck
  SafeSemaphore
  Spock
  aeson
  async
  attoparsec
  bifunctors
  blaze-builder
  blaze-builder-conduit
  blaze-builder-enumerator
  blaze-html
  blaze-markup
  blaze-textual
  cased
  cassava
  cereal
  comonad
  comonad-transformers
  directory_1_2_4_0
  dlist
  dlist-instances
  doctest
  exceptions
  fingertree
  foldl
  free
  hamlet
  hashable
  hspec
  hspec-expectations
  html
  http-client
  http-date
  http-types
  io-memoize
  keys
  language-c
  language-javascript
  language-bash
  lens
  lens-action
  lens-aeson
  lens-datetime
  lens-family
  lens-family-core
  lifted-async
  lifted-base
  linear
  list-extras
  list-t
  logict
  mime-mail
  mime-types
  mmorph
  monad-control
  monad-coroutine
  monad-loops
  monad-par
  monad-par-extras
  monad-stm
  monadloc
  mongoDB
  monoid-extras
  network
  newtype
  numbers
  optparse-applicative
  parsec
  parsers
  pcg-random
  persistent
  persistent-mongoDB
  persistent-template
  pipes
  pipes-async
  pipes-attoparsec
  pipes-binary
  pipes-bytestring
  pipes-concurrency
  pipes-csv
  pipes-extras
  pipes-group
  pipes-http
  pipes-mongodb
  pipes-network
  pipes-parse
  pipes-safe
  pipes-shell
  pipes-text
  posix-paths
  postgresql-simple
  pretty-show
  profunctors
  random
  reducers
  reflection
  regex-applicative
  regex-base
  regex-compat
  regex-posix
  regular
  relational-record
  resourcet
  retry
  rex
  safe
  sbv
  scotty
  semigroupoids
  semigroups
  shake
  shakespeare
  shelly
  simple-reflect
  speculation
  split
  spoon
  stm
  stm-chans
  stm-stats
  streaming
  streaming-bytestring
  streaming-wai
  strict
  stringsearch
  strptime
  syb
  system-fileio
  system-filepath
  tagged
  taggy
  taggy-lens
  tar
  tardis
  tasty
  tasty-hspec
  tasty-hunit
  tasty-quickcheck
  tasty-smallcheck
  temporary
  test-framework
  test-framework-hunit
  text
  text-format
  time
  tinytemplate
  transformers
  transformers-base
  turtle
  uniplate
  unix-compat
  unordered-containers
  uuid
  vector
  void
  wai
  wai-conduit
  warp
  wreq
  xhtml
  yaml
  zippers
  zlib
];

Shell helpers

в своем ~/.profile определите пару функций bash для загрузки этих сред для удобства:

env-type () {
  envtype=""
  shift
  nix-shell -Q -p $envtype "$@"
}

haskell-env () {
  env-type "haskellEnv" "$@"
}

haskell-env-hoogle () {
  env-type "haskellEnvHoogle" "$@"
}

Hoogle

вызов haskell-env-hoogle в командной строке. Это создаст все ваши пакеты + документы и загрузит вас в среду с hoogle в область. В этот момент я обычно набираю:

hoogle server --local -p 8080 &> /tmp/hoogle.log & disown

для запуска сервера hoogle фон. В конце концов, я хочу иметь службу systemd для этого, чтобы я мог просто NixOS-rebuild для восстановления документов и автоматического запуска сервера.

в Emacs

для emacs я установил haskell-hoogle-url to http://localhost:8080/?hoogle=%s, чтобы я мог получить локальные документы hoogle для ключевых слов под моим курсором. Я использую spacemacs, поэтому я просто набираю , h h для этой функции.

вы можете увидеть мою полную конфигурацию nixpkgs здесь: https://github.com/jb55/nix-files/blob/659798f2ca81fb7ad0cb5a29de576024ee16eef8/nixpkgs/config.nix#L20

надеюсь, это поможет.


haskellPackages.hoogleLocal кажется устаревшим; он больше не существует.

ответ Уильяма Казарина, по-видимому, предполагает, что у вас будет одна "среда разработки haskell", которую вы используете, а не использование nix-shell для разных сред разработки для разных проектов.

то, что я только что понял, как сделать, это написать мою оболочку.nix для переопределения ghc.withPackages и ghcWithPackages на ghc.withHoogle, так что когда nix-shell создает среду с GHC, которая знает обо всех необходимых пакетах он также создает базу данных hoogle, которая знает об одних и тех же пакетах.

вот моя раковина.Никс!--15-->1:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", withHoogle ? true }:

let

  inherit (nixpkgs) pkgs;

  f = import ./default.nix;

  packageSet = (
    if compiler == "default"
      then  pkgs.haskellPackages
      else  pkgs.haskell.packages.${compiler}
  );

  haskellPackages = (
    if withHoogle
      then  packageSet.override {
              overrides = (self: super:
                {
                  ghc = super.ghc // { withPackages = super.ghc.withHoogle; };
                  ghcWithPackages = self.ghc.withPackages;
                }
              );
            }
      else  packageSet
  );

  drv = haskellPackages.callPackage f {};

in

  if pkgs.lib.inNixShell then drv.env else drv

Я новичок в nix, но я считаю, что это должно быть в значительной степени "независимым от проекта"; я могу использовать cabal2nix . > default.nix для создания пакета nix из моего файла cabal, когда я изменяю его, без необходимости касаться оболочки.шухер.

я еще не использовал это в реальной разработке, только фиктивный проект, который я использовал, чтобы попробовать чтобы выяснить, как заставить хугла работать в nix-shell.


1скелет этого был какой cabal2nix --shell выплевывает, при этом специфические для проекта кишки удаляются и заменяются на f = import ./default.nix вместо того, чтобы снова вставлять пакет nixified cabal.