ghc-mod under stack 抱怨隐藏的主包
ghc-mod under stack complaining about hidden main package
我在使用 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)
我尝试用谷歌搜索错误消息,但它似乎只针对外部包出现,而不是正在调试的包。
devel.hs
和DevelMain.hs
这两个文件很特别:它们在.cabal
中被标记为demo
的模块,但它们正在导入demo
作为编译包,即递归依赖。
它们不会从库 demo
中公开,也不会在其他任何地方导入,因此当您 运行 stack build
时不会被编译,但是当您 运行 ghc-mod check
在它们上面,它们是在当前项目的上下文中解释的,因此递归依赖将是一个问题。
这两个毫无意义的文件的唯一目的是在 ghci 中调试您的 yesod 网站,如 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
将预先编译项目,因此这两个文件不会在那里导致任何错误。
我在使用 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)
我尝试用谷歌搜索错误消息,但它似乎只针对外部包出现,而不是正在调试的包。
devel.hs
和DevelMain.hs
这两个文件很特别:它们在.cabal
中被标记为demo
的模块,但它们正在导入demo
作为编译包,即递归依赖。
它们不会从库 demo
中公开,也不会在其他任何地方导入,因此当您 运行 stack build
时不会被编译,但是当您 运行 ghc-mod check
在它们上面,它们是在当前项目的上下文中解释的,因此递归依赖将是一个问题。
这两个毫无意义的文件的唯一目的是在 ghci 中调试您的 yesod 网站,如 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
将预先编译项目,因此这两个文件不会在那里导致任何错误。