記録です。
昔作った Android プロジェクトを久しぶりに触ろうと思い、せっかくだから sbt のバージョンも上げてみたらけっこう大変だった。
ビルド定義
とりあえず Migrating from SBT 0.7.x to 0.10.x - GitHub に従って、
- project/ を .project-0.7.4/ に移動
- project/build.properties に一行
sbt.version=0.11.1
と書いておく - 古い project/build.properties にあった内容を build.sbt に移行する
- 古い project/build/PicTumblr.scala にあった内容を project/Build.scala に移行する
という感じで。
単純な構成の場合は build.sbt だけ書けば十分ぽいけど、プロジェクトがネストしているので project/Build.scala を書く必要があった。
ビルド定義はプロジェクトルートの *.sbt か project/*.scala に書けばいい。単純な構成の場合は .sbt で事足りるらしいけど、プロジェクトが app/test でネストしているので細かいことを .scala に書く必要がある。ちなみに .scala のほうに .sbt の内容を取り込んでしまえば build.sbt もいらないっぽい。今回 .sbt には共通する単純な設定を書く、という風にしてみた。
まあ最初はまったく分からなかったので、jberkel/gist-it - GitHub を参考にコピペしたんだけど。
あと、.sbt は空行区切りだという点にちょっとはまった。
sbt プラグインの設定
プラグインの設定は、「ビルド定義プロジェクトのビルド定義」という体で書く、と理解すればいいらしい。なので project/ に視点を降ろして、project/*.sbt もしくは project/project/*.scala にプラグインへの依存を書いてやる。今回は project/plugins.sbt に書いた。
最初混乱したのが、sbt ではプロジェクト直下の "plugins" という名前のディレクトリを特別扱いしているらしく、この名前のディレクトリが存在すると (中身がなくても) そちらからプラグインの定義を読み込もうとするようになっていた (最新のソースによると deprecated らしい)。参考にしていた gist-it がこのやり方を採用していたので、挙動が把握できなくてかなり戸惑った……。
android-plugin の設定
このプラグインを入れると、ビルド定義の中で AndroidKeys._
がいろいろと使えるようになるので、これを Project
の settings
に追加してやる、というのが基本。これは別のプロジェクトを真似して作ればいい。
sbt のシェルで TAB を入力するといろいろ補完が効くのでなんとなくでも使えるようになるけれど、基本的には "android:package-debug", "android:start-emulator", "android:emulator-start" あたりのタスクを使う。まだマーケット版のコンパイルを試してないので、設定に漏れがあるかもしれない……。
小さいところでは AndroidManifest.xml に自動で versionCode, versionName を埋めこんでくれるようになっていて、すでに書いてあるとエラーになったので、当該部分を削除した。
それから、最新の Android SDK だと package-debug がうまくいかないようになってた。パッチを取りこんでもらったけれど、これを含んだバージョンがもうリリースされてるかまでは知らないので、うまく動かない人は android-plugin を git clone して自前でコンパイルするといいと思います。この辺のモジュールの管理は分からないので適当に build.sbt を書き換えて "0.6.0-LOCAL" というバージョンにして sbt publish-local
した。
参考資料
- 今回の diff (android-PicTumblr)
- 始める sbt - ようこそ
- いろいろとはまった後に読むとなんとなく分かってくる。
- sbt (+ android-plugin) でビルドされているプロジェクトのソース
こんなところです。