В среде, которую вы используете для запуска сценария, отсутствует шаг. У него есть пакет GHC и HTTP, но компилятор не знает о пакете.
То, как GHC и пакеты библиотек работают в nix, может быть немного "наизнанку" от того, что вы ожидаете. На самом деле вам нужно установить компилятор, который "зависит" от всех нужных вам библиотек, а не просто устанавливать компилятор и библиотеку по отдельности. Причина в том, что GHC предназначен для добавления пакетов библиотек путем изменения дерева файлов, в котором установлен GHC. В изменяемой файловой системе с установленной только одной системой GHC вы просто изменяете GHC всякий раз, когда была установлена библиотека, но nix не может. Nix должен иметь возможность установить замороженный GHC, который никогда не изменяется, и, возможно, многие из них.
Вместо этого вы устанавливаете крошечную оболочку, которая зависит как от базовой «сырой» установки GHC , так и от всех библиотек, которые вы хотите использовать. Затем оболочка действует как установка GHC, в которой были зарегистрированы эти библиотеки, без необходимости дублировать всю установку GHC. Когда вы просто устанавливаете пакет библиотеки сам по себе, он просто остается там инертным, и ни один GHC не может найти его просто по тому, что он существует.
Фактически, сценарий, который вы здесь показали, на самом деле не указывает, что в нем вообще должен быть установлен компилятор; он просто запрашивает HTTP
библиотеку. Когда я попробовал ваш сценарий, я получил command not found: runghc
. runghc
работает только в вашей системе, потому что он уже был на вашем пути, когда вы запускали это (возможно, потому, что у вас установлен GHC в вашем профиле?), И этот GHC не был установлен с пакетом HTTP
и поэтому не может видеть это. nix-shell
добавление только библиотеки в среду не помогает.
Вместо этого вам нужно использовать эту строку:
#! nix-shell -i runghc -p "ghc.withPackages (ps: [ ps.HTTP ])"
Вы не устанавливаете ни ghc
, ни HTTP
напрямую; вместо этого функция ghc.withPackages
вычисляет пакет nix, который устанавливает оболочку GHC, которая знает о пакете HTTP
Haskell. Под капотом это зависит от "сырого" GHC без дополнительных библиотек, а также от библиотеки HTTP
, и они тоже будут установлены.
Если вы используете множество различных сред Haskell (возможно, с помощью таких сценариев nix-shell, для каждой из которых нужен свой набор библиотек), то вы получите уникальную withPackages
оболочку, установленную в вашей системе для каждой комбинации библиотек, которую вы когда-либо использовали. Но это нормально, потому что сами обертки крошечные, и nix может совместно использовать и повторно использовать базовые GHC и пакеты библиотек между всеми этими средами.
person
Ben
schedule
10.07.2017