我的Control.Exception
Base < 4
使用Control.OldException
,Base >= 4
Base
。在使用Base < 4
和{时,我如何使用cabal或任何其他工具摆脱版本依赖关系(仅依赖Control.OldException
而非Base >= 4
)并导入Control.Exception
使用Base < 4
时{1}}?
答案 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)
这是与语言无关的答案,因此可能不适合您。
有几个选项
Base
使用什么实现。