tl; dr:安装了带有cabal沙箱的库,ghci仍抱怨库缺失
我有一个目录,我正在开发一些Haskell的东西。这曾经在ghc 7.6的另一台计算机上正常工作,但现在我正在使用ghc 7.8.2在另一台计算机上工作(我不知道版本是否重要)我得到这样的错误:
前奏> :l Interpreter.hs
Parser.hs:9:8: 找不到模块'Text.ParserCombinators.Parsec' 也许你的意思 Text.ParserCombinators.ReadPrec(来自基地) Text.ParserCombinators.ReadP(来自基地) 使用-v查看搜索到的文件列表。
尝试从ghci加载文件时。这些文件位于BASE / src / Lib中,其中BASE是具有LIB.cabal的目录以及所有这些文件。所以我认为有一些东西与cabal。为了避免可怕的故事,我在项目中制作了一个沙箱(cabal sandbox init
),我之前没有使用过。然后我手动删除了其他与cabal相关的内容并执行了cabal init
。我做了cabal install --dependencies-only
,但实际上并没有安装任何东西(我只是因为 - 依赖性而猜测?我太偏执了全局安装以使用常规的cabal安装)。所以我尝试手动将内容添加到我的.cabal
文件中(这是你应该怎么做的?),即:
build-depends:
base> = 4.7&& < 4.8,
containers >=0.5 && <0.6, -- parsec == 3.1.* -- THIS is the line I added
现在我做了cabal install --dependencies-only
。瞧,实际安装的东西,特别是:
[21 of 25]编译Text.Parsec(Text / Parsec.hs,dist / dist-sandbox-a2fe5095 / build /Text/Parsec.o)
...
就地注册parsec-3.1.5 ...... 在/ home / PATHTODIR / Stack中安装库 郎/ .cabal的沙箱/ lib目录/ x86_64的Linux的-GHC-7.8.2 /秒差距-3.1.5 注册parsec-3.1.5 ...... 已安装parsec-3.1.5
所以我尝试在ghci中加载相同的文件,产生相同的错误。请注意问题是Text.ParserCombinators.Parsec,根据我运行cabal install --dependencies-only
的时间,它似乎安装得很好。以下是ghc -v Interpreter.hs
的输出结果:
格拉斯哥Haskell编译器,版本7.8.2,第2阶段由GHC版本7.4.1启动
使用二进制包数据库:/opt/ghc/7.8.2/lib/ghc-7.8.2/package.conf.d/package.cache
有线包ghc-prim映射到ghc-prim-0.3.1.0-948744e1f99cc8bcc7c7d3ba60c7c2d8
有线输入包integer-gmp映射到integer-gmp-0.5.1.0-dc47f6b546fc171f67a7f7d311684a99
有线封装基址映射到base-4.7.0.0-018311399e3b6350d5be3a16b144df9b
有线输入包rts映射到builtin_rts
有线包模板-haskell映射到template-haskell-2.9.0.0 -
dcc8c210fb02937e104bc1784d7b0f06
未找到有线程序包dph-seq。
未找到有线输入包dph-par。
Hsc静态标志:
有线包ghc-prim映射到ghc-prim-0.3.1.0-948744e1f99cc8bcc7c7d3ba60c7c2d8
有线输入包integer-gmp映射到integer-gmp-0.5.1.0 -
dc47f6b546fc171f67a7f7d311684a99
有线封装基址映射到base-4.7.0.0-018311399e3b6350d5be3a16b144df9b
有线输入包rts映射到builtin_rts
有线包模板-haskell映射到template-haskell-2.9.0.0 -
dcc8c210fb02937e104bc1784d7b0f06
未找到有线程序包dph-seq。
未找到有线输入包dph-par。
* 追逐依赖关系:
从以下各处追逐模块:* Interpreter.hs
Parser.hs:9:8: 找不到模块'Text.ParserCombinators.Parsec' 也许你的意思 Text.ParserCombinators.ReadPrec(来自基地) Text.ParserCombinators.ReadP(来自基地) 搜索地点: 文/ ParserCombinators / Parsec.hs 文本/ ParserCombinators / Parsec.lhs
Parser.hs:10:18: 找不到模块'Text.Parsec.Token' 搜索地点: 文/秒差距/ Token.hs 文本/秒差距/ Token.lhs
Interpreter.hs:11:8: 找不到模块'Control.Monad.Error' 也许你的意思 Control.Monad.Fix(来自基地) Control.Monad.ST(来自基地) Control.Monad.Zip(来自基地) 搜索地点: 控制/单子/ Error.hs 控制/单子/ Error.lhs
Interpreter.hs:15:8: 找不到模块'Text.ParserCombinators.Parsec.Error' 搜索地点: 文/ ParserCombinators /秒差距/ Error.hs 文/ ParserCombinators /秒差距/ Error.lhs *删除临时文件: 删除: * 删除临时目录: 正在删除:
答案 0 :(得分:11)
ghc / ghci不会自动识别沙箱。默认情况下,它们仅查看全局和用户包数据库。
使用cabal repl
启动ghci,或关注文章cabal sandbox tips中的收件人。两者都可能需要最近(1.18之后)的阴谋集。