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-installed 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
文件?
如果你有这两个,你应该可以使用 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 以使用 module 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 到一个子目录,它仍然可以工作:
$ cd src
$ ghc-mod check ./Data/List/Split.hs
然而,如果你离开,ghc-mod 将不起作用 split.cabal
:
(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
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-installed 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
文件?
如果你有这两个,你应该可以使用 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 以使用 module 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 到一个子目录,它仍然可以工作:
$ cd src
$ ghc-mod check ./Data/List/Split.hs
然而,如果你离开,ghc-mod 将不起作用 split.cabal
:
(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