在沙箱中安装了 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作业

如何获得光泽以不关闭 ghci?

在Kali Linux 2020系统中安装配置和使用cuckoo沙箱

Node.JenCourse错误

在 Windows 中安装的 MonoDevelop 中看不到 iPhone