[英]Using ghc-pkg list and cabal list --installed give different lists
我正在尝试加载.hs文件,但是当我import Data.Numbers.CReal
,它给了我错误: Failed to load interface for 'Data.Numbers.CReal'
。 我已经运行了cabal install numbers
,如果我cabal list --installed
了cabal list --installed
,则会显示pkg,但是如果我ghc-pkg list
不会显示(同样,如果我ghc-pkg check
它会给出很多黑线警告的信息)。 它与我的非加载文件有关吗? 我该如何解决?
PS。 我知道如何导入软件包,但是我不确定是否正确导入了这个软件包。
感谢和抱歉,如果我没有正确解释自己。
我想到两个假设:
cabal
选择的是ghc
及其参与工具ghc
版本与您的shell不同。 您可以通过运行以下两个命令来检查这种差异:
cabal exec -- ghc --version ghc --version
他们说同样的话吗? 如果是这样,请拒绝该假设。 否则,您应该决定是更喜欢外壳的选择还是阴谋集团的选择(我建议您更喜欢外壳的选择)。
如果您更喜欢cabal
的选择,可以通过在命令后附加-<version>
来使用特定版本的GHC(和其他GHC工具)。 例如,尝试ghc-pkg-7.10.3 list
以查看7.10.3版的软件包数据库中的内容,或者尝试ghci-7.10.3
来运行特定版本的REPL。 您可以通过添加符号链接或类似于PATH
方式使这些更改永久生效。
如果您更喜欢shell的选择,则可以要求cabal
与cabal configure -w ghc
一起使用该版本; 或者,如果您担心cabal
和您的shell将以不同的方式解析ghc
,则可以要求使用cabal configure -w ghc-7.10.3
或类似的特定版本。
您的外壳与cabal
同意使用哪种版本的GHC,但是您位于cabal沙箱中。 cabal list --installed
告诉您沙箱中已经安装了什么,但是ghc-pkg list
告诉您用户包数据库中已经安装了什么。 您可以检查以下两个命令之间的差异:
cabal exec -- ghc-pkg list numbers ghc-pkg list numbers
(如果您使用的是新的cabal-不知道它出现在哪个版本中,还可以尝试使用cabal hc-pkg list
而不是cabal exec -- ghc-pkg list
。这可能是更向前兼容的方式,因此养成良好的习惯。)
如果这些打印出相同的内容,请拒绝该假设。 否则,您应该决定是否要继续使用沙箱(我建议继续使用沙箱)。
如果要停止使用沙箱,可以将--ignore-sandbox
传递给cabal
。 要使其永久存在,请查看cabal.sandbox.config
文件,该文件将包含指向实际沙箱的指针(通常是.cabal.sandbox
)。 删除配置和沙箱。 您还可以通过添加ignore-sandbox: True
来全局地忽略沙ignore-sandbox: True
~/.cabal/config
,但是我强烈建议您这样做。
如果要保留沙箱,则需要对所有GHC工具使用cabal exec
,以确保选择了正确的软件包数据库。 例如,尝试使用cabal exec ghci
运行具有访问沙箱包数据库权限的REPL。
这些假设并非相互排斥: 两者都可能发生。 在那种情况下,我强烈建议选择最终解决方案(“对所有GHC toolsuite执行都使用cabal exec
”),因为它可以透明地处理这两个问题:标准的GHC toolsuite命令将被重写为引用显式版本的命令(例如, cabal exec ghc
将实际执行ghc-7.10.3
),然后将环境设置为指向正确的软件包数据库。
答案
您可以通过运行以下两个命令来检查这种差异:
cabal exec-ghc --version ghc --version
他们说同样的话吗?
是的。 我不记得第二种选择,但是我已经设法自己解决了。 我专门做的是:
现在,ghc-pkg list命令和cabal list --installed显示了我已安装的软件包,它们可以正常工作。
PS。 我提供了该过程的详细信息,以防将来有人需要。 仍然不确定是什么导致cabal和ghc没有显示相同的pkg。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.