ghc-mod под стеком жалуется на скрытый основной пакет
У меня есть следующая проблема с ghc-mod
что мешает мне использовать ide для некоторых файлов в yesod
проект приложения.
Я устанавливаю шаблон приложения следующим образом:
/tmp$ stack new demo yesod-sqlite && cd demo
/tmp/demo$ stack setup && stack build && stack install ghc-mod
Что дает следующее stack.yaml
(закомментированные строки удалены):
resolver: lts-5.6
packages:
- '.'
extra-deps: []
flags: {}
extra-package-dbs: []
И это demo.cabal
: http://pastebin.com/i4n1TR6W.
Затем работает stack exec -- ghc-mod check app/main.hs
не выдает ошибок, но stack exec -- ghc-mod check app/devel.hs
имеет это сказать:
app/devel.hs:2:1:Failed to load interface for ‘Application’It is a member of the hidden package ‘demo-0.0.0’.Perhaps you need to add ‘demo’ to the build-depends in your .cabal file.
Итак ghc-mod
почему-то думает, что этот пакет сам по себе спрятан? Но любое другое место, где файлы проекта импортируются другим способом, проверяет исправность, и приложение собирается и работает успешно. Единственная специфика об этом файле использует PackageImports
расширение языка:
{-# LANGUAGE PackageImports #-}
import "demo" Application (develMain)
Я попытался погуглить сообщение об ошибке, но, похоже, оно касается только внешних пакетов, а не того, который отлаживается.
1 ответ
Эти два файла devel.hs
а также DevelMain.hs
являются совершенно особенными: они помечены как модуль demo
в .cabal
но они импортируют demo
как скомпилированный пакет, т.е. рекурсивная зависимость.
Они не выставлены из библиотеки demo
и нигде не импортируется, поэтому не будет скомпилирован при запуске stack build
, но когда ты бежишь ghc-mod check
на них они интерпретируются в контексте текущего проекта, поэтому рекурсивная зависимость будет проблемой.
Единственная цель этих двух бессмысленных файлов - отладка вашего сайта yesod в ghci, как говорится в комментарии. DevelMain.hs
заявил:
-- | Running your app inside GHCi.
--
-- To start up GHCi for usage with Yesod, first make sure you are in dev mode:
--
-- > cabal configure -fdev
--
-- Note that @yesod devel@ automatically sets the dev flag.
-- Now launch the repl:
--
-- > cabal repl --ghc-options="-O0 -fobject-code"
--
-- To start your app, run:
--
-- > :l DevelMain
-- > DevelMain.update
--
-- You can also call @DevelMain.shutdown@ to stop the app
--
-- You will need to add the foreign-store package to your .cabal file.
-- It is very light-weight.
--
-- If you don't use cabal repl, you will need
-- to run the following in GHCi or to add it to
-- your .ghci file.
--
-- :set -DDEVELOPMENT
--
-- There is more information about this approach,
-- on the wiki: https://github.com/yesodweb/yesod/wiki/ghci
cabal repl
а также stack ghci
предварительно скомпилирует проект, поэтому эти два файла не вызовут там никакой ошибки.