在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库
Posted
技术标签:
【中文标题】在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库【英文标题】:Installed parsec in sandbox, but can't find libraries when trying to load file in ghci 【发布时间】:2014-05-31 23:38:44 【问题描述】: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 sandbox init
),这是我以前没有使用过的。然后我手动删除了其他与阴谋集团相关的东西并做了cabal init
。我做了cabal install --dependencies-only
,但实际上并没有安装任何东西(我猜是因为 --dependencies-only?我对全局安装过于偏执,无法使用常规的 cabal 安装)。所以我尝试手动将内容添加到我的.cabal
文件中(你应该这样做吗?),即:
构建依赖:
基础 >=4.7 &&
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 中安装库 lang/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.2/parsec-3.1.5 正在注册 parsec-3.1.5... 安装了 parsec-3.1.5
所以我尝试在 ghci 中加载相同的文件,产生相同的错误。请注意,问题是 Text.ParserCombinators.Parsec,根据我运行 cabal install --dependencies-only
的时间,它似乎安装得很好。这是我使用ghc -v Interpreter.hs
得到的输出:
Glasgow Haskell 编译器,版本 7.8.2,由 GHC 版本 7.4.1 引导的第 2 阶段
使用二进制包数据库:/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
连线包template-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
连线包template-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” 搜索地点: 文本/Parsec/Token.hs 文本/Parsec/Token.lhs
Interpreter.hs:11:8: 找不到模块“Control.Monad.Error” 也许你的意思是 Control.Monad.Fix(来自基础) Control.Monad.ST(来自基础) Control.Monad.Zip(来自基础) 搜索地点: 控制/Monad/Error.hs Control/Monad/Error.lhs
Interpreter.hs:15:8: 找不到模块“Text.ParserCombinators.Parsec.Error” 搜索地点: 文本/ParserCombinators/Parsec/Error.hs 文本/ParserCombinators/Parsec/Error.lhs * 删除临时文件: 删除: * 删除临时目录: 删除:
【问题讨论】:
【参考方案1】:ghc/ghci 不会自动识别沙箱。他们默认只查看全局和用户包数据库。
要么使用cabal repl
启动ghci,要么按照我的文章cabal sandbox tips 中的食谱进行操作。两者都可能需要最近(1.18 后)的阴谋集团。
【讨论】:
太好了,我升级到 cabal v. 1.19,现在一切正常。顺便说一句,我没有发现任何关于 ghc 忽略沙盒的内容;该文档似乎只关注如何使用沙箱构建库,而不是如何使用沙箱进行开发。我在这里缺少什么吗? 不直接调用ghc也可以开发:cabal repl、cabal build等以上是关于在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库的主要内容,如果未能解决你的问题,请参考以下文章
如何查看 Laravel 中安装了哪个 Vue 版本以及如何更新?
如何在Hortonworks沙箱Hadoop平台中运行mapreduce作业