ghc-mod为什么不使用我的cabal沙盒?

4
runghc -package-db=.cabal-sandbox/.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d hellowai.hs

对我来说完美运作。

同样地,使用

ghci -package-db=.cabal-sandbox/.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d 

我也能够在ghci中轻松导入我的安装在cabal-sandbox中的Wai包。

但是当我使用ghc-mod验证我的Haskell源代码时,出现了问题:

ghc-mod check --boundary="" -g -package-db=.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d hellowai.hs
hellowai.hs:4:8:Could not find module ‘Network.Wai.Handler.Warp’Use -v to see a list of the files searched for.
hellowai.hs:3:8:Could not find module ‘Network.HTTP.Types’Perhaps you meant  Network.HTTP.Base (from HTTP-4000.2.19)  Network.HTTP.Base (needs flag -package HTTP-4000.2.10)  Network.HTTP.Headers (needs flag -package HTTP-4000.2.10)Use -v to see a list of the files searched for.
hellowai.hs:2:8:Could not find module ‘Network.Wai’Perhaps you meant  Network.BSD (needs flag -package network-2.4.2.3)  Network.URI (needs flag -package network-2.4.2.3)  Network.TCP (needs flag -package HTTP-4000.2.10)Use -v to see a list of the files searched for.

为什么无法找到我的cabal沙盒安装的模块?

1个回答

4
你是否有一个名为 cabal.sandbox.config 的文件?你的项目是否使用了 .cabal 文件?
如果两者都有,你应该可以使用 ghc-mod check ... 命令并成功运行。
使用 .cabal 文件的另一个好处是,你可以使用 cabal repl 命令调用 ghci,使用 cabal run 命令调用 runhaskell 并带上正确的命令行选项。
更新:
以下是一个你可以尝试的步骤,以查看 ghc-mod 是否能够找到你的 cabal sandbox。也许这可以帮助你确定你的设置有何不同。
从一个干净的目录开始:
$ mkdir foo
$ cd foo
$ cabal sandbox init
$ cabal get split
$ cd split-0.2.2
$ cabal sandbox init --sandbox=../.cabal-sandbox

请在 split.cabal 文件的第 55 行左右添加 heredoc 作为依赖项。

请编辑 src/Data/List/Split.hs 文件,使用模块 Text.Heredoc

{-# LANGUAGE QuasiQuotes #-}
...
import Text.Heredoc
...
foo :: String
foo = [here|this is a test|]

请确保已安装heredoc

$ cabal install --only-dependencies

最后这应该能够正常工作:
$ ghc-mod check ./src/Data/List/Split.hs

如果你进入一个子目录,它仍然可以工作:

$ cd src
$ ghc-mod check ./Data/List/Split.hs

然而,如果您移动split.cabal,ghc-mod将无法正常工作:
(back at the top level directory)
$ mv split.cabal split.cabal-old
$ ghc-mod check ./src/Data/List/Split.hs

在这种情况下,我将沙盒创建在我们工作目录的父目录中,但如果最初的沙盒是这样创建的,事情也应该能够正常运作:
$ mkdir foo
$ cd foo
$ mkdir sandbox-dir
$ cd sandbox-dir
$ cabal sandbox init
$ cd ..
$ cabal get split
$ cd split-0.2.2
$ cabal sandbox init --sandbox=../sandbox-dir/.cabal-sandbox

我的实验表明,你还需要一个 .cabal 文件。 - ErikR
我该如何生成一个.cabal文件? - Calvin Cheng
不过,即使有了我的 .cabal 文件,ghc-mod 仍然不知道在 cabal 沙盒中查找我的第三方包的位置。 - Calvin Cheng
但是 cabal exec -- runghc hellowai.hs 是可行的(即能够找到沙箱)。 - Calvin Cheng
我已经更新了我的答案,并提供了一个对我有效的方法。也许你可以使用它来找出与你设置不同的地方。 - ErikR
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接