Subscribed unsubscribe Subscribe Subscribe

あるパッケージのバージョンによって別のパッケージへの依存関係を変更する

haskell

具体的にはaesonのバージョンが新しい場合にのみscientificを依存関係に組み込みたいとする。

library
  build-depends:
    (aeson >= 0.3.2.5 && < 0.7.0) || (aeson >= 0.7.0 && scientific)

こんな感じにできないかなぁと思っていたが、これはparse errorになり動かない。同僚に聞いてみたところ、flagを使うのが定石らしい。

flag aeson070
  default: False
  manual: False

library
  if flag(aeson070)
    build-depends:
        aeson >= 0.7.0
      , scientific
  else
    build-depends:
     aeson >= 0.3.2.5 && < 0.7.0

aeson070という名前は何でも良い。なぜならmanual: Falseの場合*1、Cabalはaeson070 == Falseでインストールを試み、失敗した場合は自動的にaeson070 == Trueにして再度インストールしようとする。要するにユーザが手で指定するフラグでは無いので何でも良い。

*1:Falseがデフォルト値