【问题标题】:Haskell - Module not found (hidden package)Haskell - 找不到模块(隐藏包)
【发布时间】:2013-01-14 20:29:14
【问题描述】:

我最近为我正在学习的编程课程安装了适用于 Windows 的 Haskell 平台。它包括作为编译器的 GHCi 和作为打包系统的 Cabal。我一直在尝试使用 Cabal 安装 Craft3e 包,因为这是我的教科书使用的练习包,但无济于事。 要安装 Craft3e,我只需在命令提示符下输入 cabal unpack Craft3e,这将创建目录“\Craft3e-0.1.0.8”。进入目录后,我输入cabal install --disable-documentation,得到如下信息:

Resolving dependencies...
In order, the following would be installed: 
time-1.2.0.5 (new version)
random-1.0.1.1 (reinstall) changes: time-1.4 -> 1.2.0.5
QuickCheck-2.5.1.1 (reinstall)
Craft3e-0.1.0.8 (new package)
cabal: The following packages are likely to be broken b
haskell-platform-2012.4.0.0
Use --force-reinstalls if you want to install anyway.

使用cabal install --disable-documentation --force-reinstalls 后,按预期安装。我加载了一个模块来测试它:ghci PicturesSVG。这成功加载。但是,一旦我退出 GHCi 编译器并返回它,我就无法再从 Craft3e 包中加载模块;相反,我收到消息:

GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.

<command line>:
    Could not find module `PicturesSVG'
    it is a hidden module in the package `Craft3e-0.1.0.8'
    Use -v to see a list of the files searched for.
 Failed, modules loaded: none.

发生了什么?当我输入ghc-pkg list 时,该包仍然显示。我试过输入ghc-pkg expose Craft3e-0.1.0.8,但提示告诉我:

WARNING: cache is out of date: C:/Program Files (x86)/Haskell Platform/2012.4.0.
0\lib\package.conf.d\package.cache
  use 'ghc-pkg recache' to fix.

我已经完成了重新缓存,并重新输入了“公开”命令,但仍然没有结果。

任何解决方案都将不胜感激!

【问题讨论】:

    标签: haskell module package hidden cabal


    【解决方案1】:
    cabal: The following packages are likely to be broken b
    haskell-platform-2012.4.0.0
    

    这是一个非常不好的信号。如果您非常清楚自己在做什么,那么您应该只使用--force-reinstalls,而作为一个新学习者,您或多或少从定义上不知道。 cabal 应该更严厉地警告。

    问题的根源在于软件包的依赖项被指定得太严格,以至于默认情况下无法与 ghc-7.4 或更高版本一起使用,因为它们附带的 time 软件包版本大于 craft3e 允许的版本。 s .cabal 文件。解决该问题的正确方法是放松对time 的依赖绑定(应该由作者完成,但在固定版本被破解之前,用户应该编辑.cabal 文件以允许time-1.4.*如果(s)他有一个ghc &gt;= 7.4,那么可以在不重新安装任何东西的情况下构建包,从而可能会破坏已安装的包)。

    重新安装timerandomQuickCheck 可能破坏了许多软件包,请从命令行运行ghc-pkg check 以评估损坏情况。也许只是 ghc-pkg unregistering time-1.2.0.5 并重新安装 randomQuickCheck 会解决它,也许你需要重新安装更多,也许是整个平台。

    在以某种方式修复损坏的包后,进入Craft3e-0.1.0.8目录,编辑Craft3e.cabal文件,更改行

    time >= 1.1 && < 1.3,
    

    build-depends字段中

    time >= 1.1 && < 1.5,
    

    并在那里运行cabal install --disable-documentation


    Could not find module `PicturesSVG'
    it is a hidden module in the package `Craft3e-0.1.0.8'
    

    没错。该包不公开任何模块,因此它附带的所有模块都是隐藏的(不确定这是否真的是有意的)。您只能从它们所在的目录加载它们,因为 ghci 更喜欢从当前目录(树)加载源文件而不是打包模块。如果您从该目录调用 ghci,它应该加载该文件。 (或者你也可以在从另一个目录调用ghci时指定目录的路径,ghci -ipath/to/Craft3e-0.1.0.8 PicturesSVG。)

    【讨论】:

    • 感谢您的回答!你最后一个建议的问题是我最终需要在我自己的程序中导入这些模块,然后我将无法指定路径......或者我会吗?有没有办法暴露模块?
    • 您仍然可以使用-i 标志指定路径。当然,您也可以公开模块,只需注释掉或删除.cabal 文件中的other-modules 行。
    • 只是一个更新:我重新安装了整个平台并重新下载了软件包,并编辑了 .cabal 文件以反映您指定的更改。之后,我尝试安装该软件包,但没有成功。关于需要多个版本的“时间”的软件包。
    • 啊,我只检查了cabal build,和cabal install,我认为它检查了.cabal 文件中的(本地副本)hackage 索引中的包。您可能还需要在 .cabal 文件中更改软件包版本。此外,它可能表明您的旧用户包 db 仍然存在。那可能在Users\You\AppData 下的某个地方,找到ghc-pkg list 的路径,它会打印出全局包db 的位置及其内容,然后对于用户db 也是如此。在 Linux 上,用户 db 通常是 /home/user/.ghc/x86_64-linux-7.6.1/package.conf.d
    • 在 Windows 上,路径的第一部分会不同,最后部分应该相同。删除用户package.conf.d,如果那仍然是旧用户。
    【解决方案2】:

    Craft3edoesn't actually expose any modules。 cabal 文件似乎主要用于分发和依赖目的,而不是为您提供适当的库接口,因此要加载任何模块,您总是需要显式打开包含它的文件。

    【讨论】:

      【解决方案3】:

      我已经更新了 Craft3e 包以考虑新版本的时间。对于造成的任何问题,我们深表歉意。

      【讨论】:

        猜你喜欢
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 2013-08-05
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        相关资源
        最近更新 更多