Использование 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.