如何将 Haskell 依赖项的版本固定到与 Cabal 的底层本机依赖项的版本



在我的特殊情况下,我在Haskell软件包bindings-libzip上的阴谋集团文件中有一个依赖项。特别是,我可以接受几种不同版本的libzip,例如 bindings-libzip-0.11bindings-libzip-0.10 .这些又依赖于各自的本机 C libzip库版本 0.110.10

因此,我在.cabal文件中bindings-libzip >= 0.10 < 0.12

Haskell软件包bindings-libzip-x PkgConfig-Depends指定客户端计算机上必须存在libzip版本x。假设下游用户安装了版本 0.10libzip。但是,在拉下我的包时,此用户会拉下可能的最新依赖项,并传递下拉bindings-libzip的版本0.11。这会导致生成过程出错,并显示有关安装libzip版本不正确的消息。

有什么方法可以在我的 .cabal 文件中指定当且仅当pkg-config检测到libzip的版本 0.11 时使用 bindings-libzip-0.11,并且当且仅当pkg-config检测到libzip的版本 0.10 时使用 bindings-libzip-0.10

我提交另一个答案,因为这使用了另一个想法......

使用带有defaultMainWithHooksArgs的自定义 Setup.hs 允许您检查和修改 cabal configure 命令的参数。

这是一个不做任何修改的 Setup.hs:

import Distribution.Simple
import Distribution.Simple.Configure
import System.Environment
main = do
  args <- getArgs
  defaultMainWithHooksArgs simpleUserHooks args

如果你的 .cabal 文件定义了标志,例如:

Flag Foo
  Default:  False

然后在 args 中您将看到"--flags=-foo".所以这个想法是:

  1. 在 .cabal 文件中定义两个标志 - use10use11 以选择要使用的bindings-libzip版本。
  2. 在自定义 Setup.hs 中确定要使用的版本。
  3. 找到"--flags=..."参数并对其进行适当修改,然后再将其传递给defaultMainWithHooksArgs
我认为这样做

的方法是使用自定义Setup.hs文件(在 .cabal 文件中指定build-type: Custom

可以使用如下所示的main重写生成过程的特定阶段:

main = defaultMainWithHooks $ simpleUserHooks { preConf = myPreConf }
myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
myPreConf args configFlags = ...

覆盖confHook也可能是您想要的。

一些链接:

  • 所有阴谋集团的钩子:data UserHooks
  • 标准挂钩组:(链接(

自定义 Setup.hs 文件覆盖confHook的示例:

abc桥arb-fft卡巴尔姆德弗普姆暗处-文本格利福快乐的巴拉-webkit-服务器哈斯克林HDBC-postgresql螺旋HLBFGSB赫利布萨斯HPQ类型赫鲁比高空傲慢照亮英特尔-AES基拉姿势KiCS-debugger利卜普克LLVM-General莫尔费什Postgresql-libpq狨猴-普罗弗狨猴-证明剂狨猴证明者理论Tamarin-prover-utilsWXCWXCore

特别是,hruby Setup.hs看起来像是在做你想做的事情。

最新更新