我使用
cabal install timezone-series-0.1.5.1
安装了时区系列 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’
我尝试使用以下方法明确将 cabal 目录包含在 GHC 的搜索路径中:
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
字段,如 cabal 手册中所述。
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
),如果之前安装了冲突的软件包,则会失败。当您遇到错误时,您可以删除该包环境并重试。
对于小程序,您还可以使用 cabal 脚本
{- cabal:
build-depends: base, timezone-series == 0.1.5.1
-}
然后您可以使用 cabal run MyFile.hs
构建并运行您的程序。在 Linux 和 MacOS 上,您还可以添加 shebang 并使文件本身可执行:
#!/usr/bin/env cabal
有关更多信息,请参阅:https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-run