依存関係のバージョンに応じて異なるインポート

cabal haskell
依存関係のバージョンに応じて異なるインポート

Base ⇐ 4`の Control.OldException`である Base <4`の Control.Exception`を使用するモジュールがあります。 cabalまたは他のツールを使用して、バージョン依存関係を取り除き(「Base <4」ではなく「Base」に依存する)、「Base> = 4」および「Control」を使用するときに「Control.OldException」をインポートするにはどうすればよいですか「ベース<4」を使用する場合の例外

  4  1


ベストアンサー

cabal http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#cpp [使用するパッケージのバージョンに基づいて特定のCPP定義を自動的に設定]。

だからあなたの場合は:

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

この方法は、cabalで問題なくビルドできます。

(実際には、新しい例外を使用し、ベース<4をサポートすることはありませんが、それは私だけです)

8


Cabalでは、これは「フラグ」とその制約解決アルゴリズムで行われます。 例(http://hackage.haskell.org/[Hackage]のhttp://hackage.haskell.org/package/control-monad-exception[control-monad-exception]から):

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`を使用します。 (コマンドラインからフラグをオンにすることもできます。)

1


これは言語にとらわれない答えなので、あなたには当てはまらないかもしれません。

いくつかのオプションがあります

  1. 両方を持つSuperExceptionで両方の例外をラップします
    実装。 「Base」に基づいてどの実装を使用するかを伝えるパラメーターを指定します。

  2. 例外をリコールし、呼び出しをオーバーライドしてOldExceptionの子にします。
    (最良のオプション)

-1


タイトルとURLをコピーしました