如何导入使用 Cabal 安装的 Haskell 模块?

时间:2021-05-25 04:39:37

标签: haskell ghc cabal ghci

我使用 cabal install timezone-series-0.1.5.1 安装了 timezone-series Haskell 模块。

然后我定义了一个名为 Main.hs 的模块,它以:

import Data.Time.LocalTime.TimeZone.Series -- from timezone-series-0.1.5.1

当我运行 ghc Main.hs 时,GHC 抛出以下错误:

/home/ubuntu/Main.hs:2:1: error:
    Failed to load interface for ‘Data.Time.LocalTime.TimeZone.Olson’

我尝试使用以下方法在 GHC 的搜索路径中明确包含 cabal 目录:

ghc -i/home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/ Main.hs

这导致搜索到了正确的路径,但 GHC 只查找以“.hs”结尾的文件:

Locations searched:
...
      /home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/Data/Time/LocalTime/TimeZone/Series.hs
      /home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/Data/Time/LocalTime/TimeZone/Series.lhs
      /home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/Data/Time/LocalTime/TimeZone/Series.hsig
      /home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/Data/Time/LocalTime/TimeZone/Series.lhsig

Cabal 反而安装了接口文件:

 /home/ubuntu/.cabal/lib/x86_64-linux-ghc-8.0.2/timezone-olson-0.2.0-KqRNJj3zomR7zz2Yx6P5Oq/Data/Time/LocalTime/TimeZone/Olson.hi

从 GHC 源代码的第 318 行看来,GHC 会忽略“*.hi”文件,除非它在单次模式下调用(使用 -c 标志)。这样对吗? (见:https://github.com/ghc/ghc/blob/67a5a91ef5e61f3b3c84481d8a396ed48cd5d96e/compiler/GHC/Unit/Finder.hs

我怎样才能让 GHC 导入这个模块?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我建议的按照我的喜好顺序安装软件包的方法:

  1. 制作一个 cabal 包并将您要安装的 timezone-series 添加到 build-depends 字段,如 in the cabal manual 所述。

  2. 使用实验性的 cabal-env 工具基本上可以自动执行下面第 3 点的过程,然后是全局环境。每次安装新包时都会制定一个新的构建计划,因此就像删除包环境并使用所有旧包和添加的新包重新构建它一样。您可以添加如下特定约束:cabal-env "timezone-series == 0.1.5.1".

  3. 使用 cabal --package-env . --lib timezone-series 将软件包安装到本地软件包环境中。您可以在 --lib 选项后添加任意数量的软件包以安装多个软件包。如果您以后想使用一组不同的软件包,只需删除生成的 .ghc.environment.* 文件并使用一组新软件包重新运行安装。 GHC 将自动使用当前或父目录中的这些包环境文件。您可以使用 --constraint 选项指定特定约束,如下所示:--constraint "timezone-series == 0.1.5.1"

  4. 使用 cabal install --lib timezone-series 将其直接安装到全局环境 (~/.ghc/x86_64-linux-8.0.2/environments/default) 中,如果之前安装了冲突的包,这将失败。当您遇到错误时,您可以删除该包环境并重试。

最后,我想指出 GHC 8.0.2 已经很老了,所以如果您没有使用该版本的特定原因,我建议您升级。

相关问题