2015-09-20 126 views
3

在我的例子中,我在Haskell包bindings-libzip上的Cabal文件中有一个依赖项。特别是,我可以接受几种不同版本的libzip,例如, bindings-libzip-0.11bindings-libzip-0.10。这些又依赖于各自的本地文库0.110.10如何使用Cabal将Haskell依赖关系的版本固定为基础本地依赖项的版本?

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

Haskell包bindings-libzip-x指定PkgConfig-Dependslibzip版本x必须存在于客户机上。假设下游用户安装了libzip的版本0.10。但是,当下拉我的包时,此用户可能会拉下最新的依赖关系,并且会传递性地下拉bindings-libzip0.11版本。这会导致构建过程出错,并显示有关安装的libzip版本不正确的消息。

有什么办法,我可以在我的.cabal文件指定要使用bindings-libzip-0.11当且仅当pkg-config检测的libzip0.11版本,并使用bindings-libzip-0.10当且仅当pkg-config检测版本的libzip0.10

回答

2

我提交另一份答案,因为这里采用的另一个想法...

使用自定义Setup.hs与defaultMainWithHooksArgs允许您检查和修改参数传递给了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 

定义的标志,e.g然后在ARGS你会看到"--flags=-foo"。这样的想法是:

  1. 定义在.cabal文件中的两个标志 - use10use11选择使用哪种bindings-libzip版本。
  2. 在您的自定义Setup.hs中确定要使用的版本。
  3. 查找"--flags=..." arg,并在将其传递给defaultMainWithHooksArgs之前对其进行适当修改。
1

我认为要做到这一点的方法是使用自定义的Setup.hs文件

您可以通过使用一个main像这样覆盖构建过程的特定阶段(在.cabal文件中指定build-type: Custom):

main = defaultMainWithHooks $ simpleUserHooks { preConf = myPreConf } 

myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo 
myPreConf args configFlags = ... 

这也可能是重写confHook是你想要的。

一些链接:

例子。HS文件覆盖confHook

abcBridge arb-fft cabalmdvrpm darkplaces-text GLFW happybara-webkit-server haskeline HDBC-postgresql helics hlbfgsb hlibsass hpqtypes hruby hsqml hubris illuminate intel-aes keera-posture KiCS-debugger libpq llvm-general morfeusz postgresql-libpq tamarin-prover tamarin-prover-term tamarin-prover-theory tamarin-prover-utils voyeur wxc wxcore

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