繁体   English   中英

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

[英]How do you import a Haskell module that was installed using Cabal?

我使用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. 制作一个 cabal package 并将要安装的timezone-series添加到build-depends字段中,如cabal 手册中所述

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM