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

问题描述 投票:0回答:1

我使用

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 导入此模块?

非常感谢您的帮助!

haskell ghc cabal ghci
1个回答
3
投票

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

  1. 制作一个 cabal 软件包,并将要安装的

    timezone-series
    添加到
    build-depends
    字段,如 cabal 手册中所述

  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 已经很旧了,所以如果您没有特定原因使用该版本,我建议您升级。

对于小程序,您还可以使用 cabal 脚本

如果你想在单文件 Haskell 程序中使用依赖项,那么你可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.