sbtとEclipseの共存
また海藻猫が騒いでいたのを見つけてしまったのが運の尽き…。 [blackbirdpie id="126122863177633793"]
Android開発はやったことがないからわからないけど、Scala + Eclipseは使っているから、簡単に手順を書いておく。
■ teaplanet/sbt-appengine-eclipse - GitHub https://github.com/teaplanet/sbt-appengine-eclipse 以下の手順で作るふたつのbuild.sbtはGitHubに置いといた。
前提
sbtとEclipseを使ってAppEngineの開発を行う。 テストにはspecs2を使うことを想定してるので、specs2がいらない場合は後述のbuild.sbtからspecs2の依存関係消してね。こんな役割分担で使ってます。 依存関係解決:sbt エディタ:Eclipse コンパイル:Eclipse(, sbt) テスト:Eclipse(, sbt) デバッグ:Eclipse こんな構成で行います。
ライブラリの依存関係の解決はsbtに任せる。ついでにEclipseのプロジェクトファイル(.project)の生成もsbtに任せる。 Eclipseはエディタとして使いつつ、同時にコンパイルも行う。 テストしつつデバッグもEclipseで行ってる。 基本的にどちらを使ってもいいんだけど、個人的にはこうやって使ってる。
依存関係の解決をsbtがやってくれるもんだから、バージョン管理にバイナリが含まれなくて精神衛生上よい。 プロジェクトをコンパイルするにもコンソールだけで済むし(Eclipse不要)。
環境
Mac OS X 10.7.1 Scala 2.9.1 sbt 0.11.0-RC1 Eclipse Indigo開発環境構築
sbtの入手
■ Index of ivy-snapshots/org.scala-tools.sbt/sbt-launch/0.11.0-RC1 http://repo.typesafe.com/typesafe/ivy-snapshots/org.scala-tools.sbt/sbt-launch/0.11.0-RC1/ コンパイルしてもいいけど、持ってきた方が楽。今はこれを使ってます。 違うバージョンでも問題ないかもしれないけど、他のバージョンを使ってたらsbteclipseが動かなかった。sbtのインストール
入手したsbt(sbt-launch.jar)を実行するために ~/bin/sbt ファイルを作成する。java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"
chmod u+x ~/bin/sbt実行権限付けて、実行できるようにする。
プロジェクト作成
プロジェクトは "ws/sample" に作ることにする。mkdir -p ws/sample cd ws/sample sbtこれでsbtで必要なファイルが作成され、sbtのプロンプトが表示されているはず。 aboutって入力するとsbtやScalaのバージョンが表示されます。
プロジェクト定義
プロジェクト定義ファイルであるbuild.sbtを作る。 このファイルを作るときはエディタで作ってもいいし、別コンソールからviで作ってもいい。このあともちょくちょくsbtでコマンドを実行するので、sbtプロンプトは残しておいた方が便利だと思う。 ws/sample/build.sbtname := "sample"
version := "1.0.0"
scalaVersion := "2.9.1"
organization := "teaplanet"
// for Specs2
resolvers ++= Seq("snapshots" at "http://scala-tools.org/repo-snapshots",
"releases" at "http://scala-tools.org/repo-releases",
"releases" at "http://repo1.maven.org/maven2/")
libraryDependencies ++= {
val appEngineVersion = "1.5.5"
Seq(
"com.google.appengine" % "appengine-api-1.0-sdk" % appEngineVersion,
"com.google.appengine" % "appengine-api-stubs" % appEngineVersion % "test",
"com.google.appengine" % "appengine-api-labs" % appEngineVersion % "test",
"com.google.appengine" % "appengine-testing" % appEngineVersion % "test",
"com.google.appengine" % "appengine-tools-sdk" % appEngineVersion % "test",
"org.specs2" %% "specs2" % "1.6.1" % "test",
"org.specs2" %% "specs2-scalaz-core" % "6.0.1" % "test",
"junit" % "junit" % "4.9" % "test"
)
}
build.sbtの空行は大切。
このファイルを作成したら、sbtプロンプトへ戻る。
reload
update
reloadコマンドで更新したファイルを読み込み、updateコマンドで設定を反映する。 初回は依存ライブラリをダウンロードするから時間がかかると思うので、しばし待つ。 ここまででAppEngineの開発が出来る状態になってる。
sbteclipseプラグインを導入する
Eclipseのプロジェクトファイル(.project)を作るためにsbteclipseプラグインを導入する。 ws/sample/project/plugins/build.sbtresolvers += Classpaths.typesafeResolver
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse" % "1.4.0-RC4")
pluginsディレクトリは無いと思うので作成する。 ここでもbuild.sbtの空行は意味があるので注意。
またsbtプロンプトへ戻ってお約束のコマンド。
reload
update
これでsbteclipseの導入が完了。
ecl[TAB]
と打って "eclipse" と補完されるようであれば正常に導入されてる。
.projectを作るために次のコマンドを実行する。
eclipse create-src
EclipseでScalaを使う準備
■ Scala IDE for Eclipse http://www.scala-ide.org/ EclipseでScalaを使うためにScala IDE for Eclipseをインストールしておくこと。Eclipseの設定でbuildmanagerとしてsbtを使う設定ができる。 でも、これが役に立っているかはわかっていない…。
■ Using the Google Plugin for Eclipse - Google App Engine - Google Code http://code.google.com/intl/en/appengine/docs/java/tools/eclipse.html#Installing_the_Google_Plugin_for_Eclipse ライブラリの依存関係はsbtで解決してるので、こっちは必要ないかも。入れてあるけど。
Eclipseをエディタとして使う
sbtで.projectを作成したので、それを読み込む。 File -> Import...Existing Projects into Workspace
"Browse..." からws/sampleディレクトリを選択。
結果的にこんな感じにAppEngineのライブラリが読み込まれた状態でプロジェクトが出来る。
ルーティン
依存ライブラリが増えた場合はbuild.sbtを修正し、reload -> updateを行う。 その後、eclipse create-srcを実行し.projectを作成。 Eclipseに反映するために、更新(F5)を行う。この環境はsbtとEclipseの共存なので、好きな方を使えばいい。 テストの実行をリアルタイムに行いたいなら、sbtで "~test" しておけばいいし、トレース実行したいならいつものようにEclipseを使えばいい。
課題
ひとつだけ問題があって、Eclipseでテストは実行できるんだけど、sbtでコンパイルすると次のエラーが発生してテストに失敗する。NullPointerException: No API environment is registered for this thread. (DatastoreApiHelper.java:118)これはAppEngine絡みの問題なので、AppEngineを使わない人は出会わないだろうし、設定次第で解決できそうな気もする。
今回作ったプロジェクトはEclipseのプラグインを導入してない。導入した所で.projectファイル作成時に設定が上書きされ、消えてしまう。 ■ eed3si9n/sbt-appengine - GitHub https://github.com/eed3si9n/sbt-appengine sbt-appengineプラグインもあるんだけど、うまく動かなかったので放置してる。