1

我有以下问题ghc-mod阻止我在yesod应用程序项目中对某些文件使用 ide。

我安装模板应用程序如下:

/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)

我尝试使用谷歌搜索错误消息,但它似乎只针对外部包而不是正在调试的包。

4

1 回答 1

1

These two files devel.hs and DevelMain.hs are quite special: they are marked as a module of demo in .cabal but they are importing demo as a compiled package, i.e. recursive dependency.

They are not exposed from library demo nor imported anywhere else so won't get compiled when you run stack build, but when you run ghc-mod check on them, they are interpreted in the context of the current project, therefore the recursive dependency will be an issue.


The only purpose of these two otherwise meaningless files is to debug your yesod website in ghci, as the comment in DevelMain.hs stated:

-- | 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 and stack ghci will compile the project beforehand so these two files won't cause any error there.

于 2016-03-13T03:14:58.750 回答