質問: Clojure1.6と1.7のバージョン間互換についてです。 以下project.cljで依存ライブラリを指定しています。 ``` :dependencies [[org.clojure/clojure "1.7.0-beta2"] [compojure "1.3.2"] [http-kit "2.1.16"] [ring/ring-core "1.3.2"] ;; <1> [ring/ring-defaults "0.1.4"] [org.clojure/clojurescript "0.0-3211"] ;; <2> [cljs-http "0.1.30"] [org.clojure/core.async "0.1.346.0-17112a-alpha"] [org.omcljs/om "0.8.8"]] ``` 現状clojureにはstableなver.1.6とbetaの1.7がありますが、どうやらこの2つは内部のtools.readerに互換性がないようです。上の場合だと1.7依存のclojurescript<1>は動きますが、1.6依存のringサーバー<2>では「read関数に渡す引数の数が違う」という趣旨のエラーが出ます。 そこで、1.7のreaderを使うclojurescript<1>と1.6以前のライブラリ<2>において、それぞれ内部で使うtools.readerのバージョンを陽に指定する方法はないでしょうか。 もしくはもっと根本的に、1.6 - 1.7間のreader互換性の問題を解決できる方法はないでしょうか。
回答: まず、tools.readerはClojureの標準ライブラリではなく、独立したcontribライブラリなので、Clojureのバージョンが1.6なのか1.7なのかというのはここでは関係ありません。 ring-core 1.3.2が依存しているtools.readerのバージョン(0.8.1)とClojureScript 0.0-3211が依存しているバージョン(0.9.1)に互換性がないことが問題のようです。具体的にはエラーメッセージを見てみないと分からないですが、0.9.0で`read-string`のアリティが新たに追加されているのでこれが原因と思われます。 対症療法としては以下の3つが考えられるでしょうか。 * ClojureScriptのバージョンを0.0-3178に下げる * ring-coreのバージョンを1.4.0-beta1に上げる * `[ring/ring-core "1.3.2" :exclusions [org.clojure/tools.reader]]`する 1つめのClojureScriptのバージョンを下げる方法が一番無難だと思います。バージョンを0.0-3178まで下げると依存するtools.readerのバージョンが0.8.xになるのでread-stringのアリティの問題は解決されるはずです。ClojureScriptは現在、1週間に1回以上リビジョンが上がるようなペースで開発が進められています。特別な理由がなければ最新版を使う必要もないと思いますが、いかがでしょうか? 2つめは逆にring-coreのバージョンを上げることで、tools.readerのバージョンをClojureScriptに揃える方法です。ただし、1.4.0はまだbeta1が出たばかりという段階なのであまりお薦めはできません。 3つめは、使用するring-coreおよびClojureScriptのバージョンはそのままに、ring-coreからtools.readerをexcludeする方法です。ring-core内でtool.readerを使っているのは`ring.middleware.session.cookie`だけのようなので、この名前空間を使わないのであれば問題なくexcludeできる可能性があります。