[英]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 导入这个模块?
帮助将不胜感激!
我建议的按我的喜好顺序安装软件包的方法:
制作一个 cabal package 并将要安装的timezone-series
添加到build-depends
字段中,如cabal 手册中所述。
使用实验性的cabal-env
工具基本上可以自动化下面第 3 点的过程,但随后使用全局环境。 这会在您每次安装新的 package 时制定新的构建计划,因此就像删除 package 环境并使用所有旧包重新构建它,并将新的 ZEFE90A8E604A7C840E88D03A6ZF6 添加到它。 您可以像这样添加特定的约束: cabal-env "timezone-series == 0.1.5.1"
。
使用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"
。
使用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.