【问题标题】:How do I get cabal to use a local version of a package as a dependency for a Hackage package?如何让 cabal 使用本地版本的包作为 Hackage 包的依赖项?
【发布时间】:2021-10-29 19:40:28
【问题描述】:

我正在尝试在 GHC 9.2.1 上安装 aeson。我第一次运行cabal install --allow-newer --lib aeson,但在构建 attoparsec 时失败了。原来这个问题是already fixed in their Git repo,但还没有在 Hackage 上发布。然后我做了这些步骤来构建一个带有修复的本地版本:

git clone https://github.com/haskell/attoparsec.git
cd attoparsec
cabal install --allow-newer --lib .
cd ..

成功了,但是当我再次执行cabal install --allow-newer --lib aeson 时,它再次尝试从 Hackage 构建 attoparsec,因此再次失败。我怎样才能让 cabal 使用我刚刚构建和安装的东西?

【问题讨论】:

    标签: haskell cabal cabal-install


    【解决方案1】:

    主要有两种方法。

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

    packages: attoparsec yourpackage
    

    事实上,你甚至不需要克隆 repo,你可以使用 source-repository-package 字段来代替。

    因为local packages always take precedence over external ones,解析依赖时会选择repo版本。

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


    另一种方法是在您的机器中创建一个local no-index package repository,使其优先于标准黑客,然后将 attoparsec 的sdist tarball 放在那里。

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

    repository hackage.haskell.org
       url: http://hackage.haskell.org/
    

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

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

    【讨论】:

    • 我采用了第二种方法,它对我有用,谢谢。一个可能值得一提的警告:每次向本地存储库中添加内容时,都需要从本地存储库中删除 noindex.cache。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2022-01-17
    • 2018-09-18
    • 2018-07-19
    相关资源
    最近更新 更多