Haskell-mode не работает для моего проекта, не может найти модуль
Вот мой сценарий:
Я работаю над проектом со следующими каталогами/модулями:
|--proj
|-- src
|-- Foo
|-- FooModule1.hs
|-- FooModule2.hs
|-- Bar
|-- BarModule1.hs
BarModule1.hs
выглядит следующим образом:
module BarModule1 where
import Foo.FooModule1
...
У меня также есть файл .cabal
, определяющий src
как hs-source-dirs
, и, конечно, оба модуля перечислены в нем.
Когда я в файле BarModule1.hs
в Emacs, и я делаю C-c C-l, он говорит:
proj/src/Bar/BarModule1.hs:3:8:
Could not find module `Foo.FooModule1'
Use -v to see a list of the files searched for.
Failed, modules loaded: none.
Также я хочу использовать hlint
с flymake-haskell-multi-load
, и если я активирую этот режим с помощью M-x flymake-haskell-multi-load
, hlint
всегда будет показывать ошибку, что он не может найти модуль Foo.FooModule1
, потому что он не знает о файле .cabal
, в котором я указываю, что hs-source-dirs: src
.
Итак, мой вопрос: Как я могу сделать haskell-mode
и flymake
/hlint
знать о моем каталоге/дереве проекта, чтобы он нашел все модули?
В качестве альтернативы, как я могу сообщить им о модулях, указанных в моем файле .cabal
?
Ответы
Ответ 1
Как для haskell-mode
установите haskell-process-type
в cabal-repl
в ваш init файл emacs и убедитесь, что используете interactive-haskell-mode
(not inf-haskell-mode
):
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
(setq haskell-process-type 'cabal-repl)
Ответ 2
Моя конфигурация emacs основана на Emacs Prelude. И я также создаю песочницу для проекта с cabal sandbox init
.
Для аналогичной проектной структуры haskell-mode
работает хорошо. Я могу C-c C-l загружать текущий файл в repl без ошибок. Но flycheck
не может разрешить все модули и выделять операторы import
с ошибками:
Could not find module ‘Foo.FooModule1’
Use -v to see a list of the files searched for.
Существует проблема поддержка песочницы Cabal в GHС# 293 с решением. Вам нужно создать .dir-locals.el
в корне proj
, который предоставляет необходимые переменные.
((haskell-mode
(flycheck-ghc-package-databases "/path/to/proj/.cabal-sandbox/x86_64-osx-ghc-7.6.3-packages.conf.d/")
(flycheck-ghc-no-user-package-database . t)
(flycheck-ghc-search-path "/path/to/proj/src")))
-
flycheck-ghc-package-databases
- это cabal.sandbox.config
(вам может понадобиться сначала создать песочницу) package-db
-
flycheck-ghc-search-path
- это путь к proj/src
Ответ 3
В командной строке в ghci: :set -iproj/src/