sbtでつくったjarを公開して、Play!のウェブアプリケーションに依存関係を設定する
毎日まいにち、地味なビルド回りとかに異様に時間とられてますが楽しいです。
さて、題名通り、共通ユーティリティ的なjarをつくって、あっちこっちのPlay!アプリケーションで使い回したい、というときに。
まず最初の(はまり)ポイントは、「PlayのdependenciesはIvyのローカルリポジトリをみていないようだ」というところです。mavenの公開リポジトリしかみていないので、あきらめてsbtでどこかのmavenリポジトリにpublishして、Play! にリポジトリと依存jarの設定をします。
sbtでのpublishですが、正当派の手順はhttp://code.google.com/p/simple-build-tool/wiki/Publishingに書いてあります。会社の社内リポジトリへ公開するには、CIサーバ上でmvn installするのが唯一の方法!なので、私はかなり変則的にこう設定しました。
- CIサーバ上で、sbtビルド、公開
% sbt package % sbt make-pom % mvn install:install-file -Dfile=target/scala_2.8.1/some_2.8.1-1.0.jar -DpomFile=target/scala_2.8.1/some_2.8.1-1.0.pom
- Play!のdependencies.ymlの設定
require: - play - play -> scala 0.9 - com.example -> some_2.8.1 ]1.0,) repositories: - localRepo: type: iBiblio root: http://ciserver/maven2/repository contains: - com.example -> *
これで、Play! webアプリケーション側でplay dependencies --syncと実行すればjarを引っ張ってきて依存関係の設定をしてくれます。
ただ、開発進行中のこの時期、ちょっとした問題が。バージョン番号が変わらないと、Play!は依存するjarの更新してくれないらしいのです。libにあるファイルを消してもだめで、レポジトリに登録した新しいものではなく、Ivyのキャッシュにある古いjarをlibに引っ張ってきます。当たり前といえば当たり前ですが。ということで、sbtのビルドごとに、バージョン番号を変えるようにします。
project/build/以下にあるProjectファイルに以下を追記します。
override def version = BasicVersion(1,Some(System.currentTimeMillis().toInt),None,None)
もうちょっといい方法がある気がするけど。で、ビルドごとにバージョン番号が異なるので、ビルドが変わるとplay dependencies --syncでjarが更新されるようになります。
早くビルド、環境回りのことが落ち着きますように