如何让 cabal 使用本地版本的包作为 Hackage 包的依赖项?

Jos*_*ica 3 haskell cabal cabal-install

我正在尝试在 GHC 9.2.1 上安装 aeson。我第一次运行cabal install --allow-newer --lib aeson,在构建 attoparsec 时失败了。事实证明这个问题已经在他们的 Git repo 中得到了修复,但还没有在 Hackage 上发布。然后,我执行了以下步骤来构建包含修复程序的本地版本:

git clone https://github.com/haskell/attoparsec.git
cd attoparsec
cabal install --allow-newer --lib .
cd ..
Run Code Online (Sandbox Code Playgroud)

成功了,但是当我cabal install --allow-newer --lib aeson再次这样做时,它再次尝试从 Hackage 构建 attoparsec,所以再次失败。我怎样才能让阴谋集团使用我刚刚构建和安装的东西呢?

dan*_*iaz 8

主要有两种方法。

一种是创建一个cabal 项目,其中包括 attoparsec 的克隆版本和您正在处理的本地软件包(可能依赖于 aeson 的软件包)。它可以很简单

packages: attoparsec yourpackage
Run Code Online (Sandbox Code Playgroud)

事实上,您甚至不需要克隆存储库,您可以使用该source-repository-package字段来代替。

由于本地包始终优先于外部包,因此在解决依赖关系时将选择存储库版本。

这种方法效果很好,但有一个缺点,如果您在许多不同的项目中使用修补后的 attoparsec,则每次都必须引用并重新编译它。


另一种方法是在您的计算机中创建一个本地无索引包存储库,将其优先于标准 Hackage,并将 attoparsec 的sdist tarball放在那里。

您需要使用repository全局 cabal 配置字段声明额外的包存储库(配置的路径显示在 的最后一行cabal help)。默认情况下,只有 Hackage:

repository hackage.haskell.org
   url: http://hackage.haskell.org/
Run Code Online (Sandbox Code Playgroud)

要使本地包存储库优先于 Hackage,您需要active-repositories在全局 Cabal 配置或文件中使用该字段cabal.project

这种方法的优点是你不需要创建 Cabal 项目,并且 attoparsec 的修补版本只会编译一次(就像来自 Hackage 一样)。