根据依赖项的版本进行不同的导入

时间:2011-04-03 17:17:30

标签: haskell cabal

我的Control.Exception Base < 4使用Control.OldExceptionBase >= 4 Base。在使用Base < 4和{时,我如何使用cabal或任何其他工具摆脱版本依赖关系(仅依赖Control.OldException而非Base >= 4)并导入Control.Exception使用Base < 4时{1}}?

3 个答案:

答案 0 :(得分:8)

cabal automatically sets certain CPP definitions基于所用软件包的版本。

所以对于你的情况我会:

{-# LANGUAGE CPP #-}
module Blah where
#if MIN_VERSION_base(0,4,0)
import Control.OldException
#else
import Control.Exception
#endif

这种方法可以用cabal构建。

(实际上,我会使用新的例外,不会打扰支持基础&lt; 4,但那只是我)

答案 1 :(得分:1)

使用Cabal,这是通过“flags”及其约束求解算法完成的。一个示例(来自control-monad-exception上的Hackage):

Flag extensibleExceptions
  description: Use extensible-exception package
  default: False

(...)

  if flag(extensibleExceptions)
    build-depends:
      extensible-exceptions >= 0.1 && <0.2,
      base >= 3.0 && <4
  else
    build-depends:
      base >= 4 && < 5

在具有旧版base的计算机上,Cabal将尝试使用extensibleExceptions False解决依赖关系,失败,然后使用True重试,并使用不同的build-depends },这将成功。 (您也可以从命令行打开标志。)

http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#configurations记录了这种机制,页面的其余部分描述了其他机制,包括if impl(ghc >= 6.10.0)等直接条件。

答案 2 :(得分:-1)

这是与语言无关的答案,因此可能不适合您。

有几个选项

  1. 在具有两种实现的SuperException中包装两个异常。给它一个参数,告诉它基于Base使用什么实现。
  2. 使用重写调用将异常重构为OldException的子级。 (最佳选择)