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,所以再次失败。我怎样才能让阴谋集团使用我刚刚构建和安装的东西呢?
主要有两种方法。
一种是创建一个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 一样)。