问题描述
我使用 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 导入这个模块?
非常感谢您的帮助!
解决方法
我建议的按照我的喜好顺序安装软件包的方法:
-
制作一个 cabal 包并将您要安装的
timezone-series
添加到build-depends
字段,如 in the cabal manual 所述。 -
使用实验性的
cabal-env
工具基本上可以自动执行下面第 3 点的过程,然后是全局环境。每次安装新包时都会制定一个新的构建计划,因此就像删除包环境并使用所有旧包和添加的新包重新构建它一样。您可以添加如下特定约束:cabal-env "timezone-series == 0.1.5.1"
. -
使用
cabal --package-env . --lib timezone-series
将软件包安装到本地软件包环境中。您可以在--lib
选项后添加任意数量的软件包以安装多个软件包。如果您以后想使用一组不同的软件包,只需删除生成的.ghc.environment.*
文件并使用一组新软件包重新运行安装。 GHC 将自动使用当前或父目录中的这些包环境文件。您可以使用--constraint
选项指定特定约束,如下所示:--constraint "timezone-series == 0.1.5.1"
。 -
使用
cabal install --lib timezone-series
将其直接安装到全局环境 (~/.ghc/x86_64-linux-8.0.2/environments/default
) 中,如果之前安装了冲突的包,这将失败。当您遇到错误时,您可以删除该包环境并重试。
最后,我想指出 GHC 8.0.2 已经很老了,所以如果您没有使用该版本的特定原因,我建议您升级。