Словари Aspell отсутствуют при установке в nix-shell

Когда я устанавливаю пакет Aspell со словарем Aspell для английского языка в свой глобальный env с помощью Nix на Mac OSX:

$ nix-env -iA nixpkgs.aspell nixpkgs.aspellDicts.en

Тогда Аспелл ​​ведет себя так, как я ожидал:

$ aspell dump dicts

en
en-variant_0
...

Однако, если я установлю пакеты в оболочку nix, словарь не будет правильно установлен:

$ nix-shell -p aspell aspellDicts.en --pure

$ aspell dump dicts
# nothing printed

$ echo 'word lister to check' | aspell --list
Error: No word lists can be found for the language "en_US".

Каждый из следующих вариантов вызывает одно и то же проблемное поведение:

  • Установка в нечистую оболочку nix,
  • Помещаем выражение nix в файл default.nix и просто запускаем nix-shell.
  • Установка других словарей Aspell

Может кто-нибудь посоветовать, как заставить это работать?


person b73    schedule 28.11.2017    source источник


Ответы (1)


Бинарный файл aspell упакован NixPkgs, чтобы указать пути установки через переменную среды ASPELL_CONF, если она еще не указана. (Подробности cat -v result/bin/aspell)

Вы можете указать ASPELL_CONF вручную или использовать переменную среды NIX_PROFILES. Например:

$ nix-build -E 'with import <nixpkgs> {};
     buildEnv { name = "aspell-env"; paths = [aspell aspellDicts.en]; }'

$ NIX_PROFILES=./result ./result/bin/aspell dump dicts
en
en-variant_0
[...]
en_US-wo_accents

Однако, если вы хотите создать автономную aspell установку со словарями, вы можете использовать aspellWithDicts:

nix-build -E 'with import <nixpkgs> {}; aspellWithDicts (d: [d.en])'

Это жестко закодирует ASPELL_CONF, поэтому вам не нужно снова думать об этих переменных среды.

person Robert Hensing    schedule 29.11.2017
comment
Спасибо, Роберт, ваши примеры работают, как ожидалось;) В общем, я немного не понимаю, что делает buildEnv, поэтому любая дополнительная информация будет принята с благодарностью. Если я создаю и устанавливаю автономный aspell (со словарями) с помощью aspellWithDicts, он устанавливается как пакет с именем aspell-env. Могу ли я использовать это как buildInput в другом пакете? т.е. передано stdenv.mkDerivation. Мои эксперименты пока что не предполагают. Может это потому, что я не указываю путь к атрибуту? Если это так, как мне определить путь к атрибуту установленного aspell-env? Спасибо - person b73; 29.11.2017
comment
buildEnv - это функция, которая используется nix-env -i под капотом для построения ~/.nix-profile. Он создает каталоги и символические ссылки для «слияния» содержимого пакетов вместе. - person Robert Hensing; 30.11.2017
comment
Должна быть возможность использовать результат aspellWithDicts как buildInput. Не нужно думать о том, где установлен ваш aspell, потому что обычно, когда вы что-то упаковываете, вы хотите включить все зависимости через выражение Nix. Невозможно сослаться на что-либо, что установлено во время оценки, потому что это сделало бы выражение нечистым. (Исключением из этого правила является <nixpkgs>, которого вам следует избегать, но это уже другая тема) - person Robert Hensing; 30.11.2017
comment
Спасибо, Роберт, я думаю, тогда мой вопрос: как мне использовать результат aspellWithDicts как buildInput? - т.е. как мне создать автономный aspell (со словарями), а затем ссылаться на него в другом производном как на вход для сборки? Очень признателен за ваш совет. - person b73; 30.11.2017
comment
Например, он должен быть таким простым, как _1 _..._ 2_. Кажется, что-то не так с тем, как вы используете это в своем зависимом выражении. Мне кажется, что на ваш первоначальный вопрос был дан ответ, так что, может быть, вы могли бы принять ответ и открыть новый вопрос с некоторыми деталями того, чего вы пытаетесь достичь сейчас? - person Robert Hensing; 30.11.2017
comment
Спасибо, Роберт, в этом есть смысл. - person b73; 30.11.2017