繁体   English   中英

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

[英]ghc-mod does not use my cabal sandbox. why?

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沙箱安装模块。 为什么会这样?

你有cabal.sandbox.config文件吗? 您是否.cabal为项目使用.cabal文件?

如果你有这两个你应该能够使用ghc-mod check ...它会工作。

使用.cabal文件的另一个好处是,您可以使用cabal repl调用ghci和cabal run以使用正确的命令行选项调用runhaskell

更新

这是一个你可以尝试查看ghc-mod何时可以找到你的cabal沙箱的食谱。 也许这可以帮助您确定与您的设置有什么不同。

从干净的目录开始:

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM