PlayFramework Scala版をいじってみた

前回Javaフレームワークの調査だったので、Scala版をスルーしたPlayFrameworkですが、今回はScalaやってみようという話が持ち上がったのでちょっといじってみることにしました。

まずはセットアップからですが、例のごとく箇条書きメインでさくっと。

環境構築

前提

  • Windows
  • JDKが入っていること
    • Playはわりと最新のJDKを必要とするので注意。いくつものJDKが入っている場合、JAVA_HOMEで一番新しい物を指定。
  • 現時点では以下のバージョン
    • typesafe-activator-1.3.10-minimal
    • PlayFramework 2.5.3

PlayFrameworkのインストール

  • 公式のtypesafe-activator-x.x.x-minimalをダウンロード。
  • 解答し、中身のactivator.batを実行
  • しばらくするとブラウザが http://127.0.0.1:8888/home で立ち上がる。
    • この際、必要なものは自動的にダウンロードされ、サブディレクトリに配置される。
    • 古いバージョンのActivatorが入っていても特に競合したりする様子はないが、コマンドウインドウに出てくるメッセージの中には古いリポジトリのパスも見えるので、他のバージョンが入っていることはわかっているっぽい。
  • activator.batの場所に環境変数PATHを通す。もし古いバージョンがある場合には書き換える。
  • テスト用のアプリケーション「testapp1」を作成
activator new testapp1 play-scala
cd testapp1
activator
run

Eclipseの開発環境を作る

  • project/plugins.sbtに以下を追加
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
  • Ctrl+Dで一旦activatorを抜けてから、testapp1フォルダ内で以下を実行
activator
eclipse
  • Eclipseを起動。
  • 新規Workspaceを作成して開く。PreferenceでJDKのパス設定をしておく。
  • EclipseScala IDE プラグイン http://download.scala-ide.org/nightly-scala-ide-luna-211x をインストール。
    • 再起動後、設定がどうこう言ってくるので、Yesをクリックして0msのところを5msなどに変えてOKする。
  • 続いてscala-ide-play2 プラグイン https://github.com/scala-ide/scala-ide-play2/wiki をインストール。
    • Scala IDEプラグインはあくまでScala用であってPlayのことは考えてない。特にテンプレートの編集はHTMLエディタを使うしかなく、Scala部分に警告が出て見づらい。scala-ide-play2プラグインにはテンプレートエディタがついているのできちんと色分け表示される。scala-ide-play2プラグインはおそらくそのためだけのプラグインで、それ以外の機能はないと思われる。
  • メニューの[File]-[Import]-[General]-[Existing Project into Workspace]でNext
  • Select root Directoryでtestapp1フォルダを選択し、Finish
  • プロジェクト内の*.scalaファイルをどれか適当に開き、Eclipseエディタ内で色付けなどが行われていることを確認。
  • プロジェクト内のviews*.htmlファイルをどれか適当に開く。この時点では標準テキストエディタで開かれる。右クリックしOpen With → New Template Editorを選択するとHTML+Scalaのきちんと色分けされた表示になる。これをデフォルトにするには、Opwn With → Other → New Template Editor を選択。Use this editor with ...にチェックを入れ、さらにUse it for all *.html...にもチェックを入れる。 これではなぜか行かないのでPreference→Editorから行う。
  • [Project]-[Property]-[Java Build Path]-[Libraries]でAdd Class Folderをクリック。プロジェクト内のtarget\scala-2.11\classesを選択してOK。
  • コマンドウインドウ上で以下を実行
activator -jvm-debug 9999 run
  • [Debug As]-[Debug Configuration]でRemote Java Applicationを指定し、Newで新規設定を追加。
    • Portを9999にする。
    • Apply
    • Multiple launchers availableというエラーが出ているので[Select one]をクリックして[Use configuration...]のチェックをして、Eclipse JDT Launcherではなく、Scala Remote Launcherを指定してOK。JDTランチャーだとデバッグできない。 ←ここが重要。ググっても出てこなかった。
    • Debugボタンをクリック。
  • 以下の手順でデバッグテスト
    • app/controllers/HomeController.scalaの以下の行にブレイクポイントをつける。
Ok(views.html.index("Your new application is ready."))
  • http://localhost:9000/にアクセス。Debugパースペクティブに切り替わってブレイクポイントで止まればOK。
    • 止まらない場合、Eclipseが使っているJDKとactivatorが使っているJDKが同じものであるか確認。
    • それ以外にも止まらないことがあるので要調査。
  • F8で最後まで実行するとブラウザにYour new application is ready.のページが表示される。

    Eclipseでのデバッグのテスト

  • きちんとセットアップが完了していると、「Eclipse上のエディタでソースを編集→ブレイクポイントを設定→ブラウザでhttp://localhost:9000/をリロード」という手順でデバッグができる。これを確認。

  • HomeController.scalaを以下のように編集
  def index = Action {
    var str = "TEST"
    Ok(views.html.index(str))
  }
  • 上記ファイルを保存(重要)
  • OKの行にブレイクポイントを設定
  • http://localhost:9000/にアクセス。
  • Eclipse上ではOK行のブレイクポイントで止まっている。Variablesビューでstrのところに"TEST"と表示されていることを確認。
  • F8
  • ブラウザ上にページが表示され"Your new application is ready."だった箇所が"TEST"になっていることを確認。

ここまでで気をつけること(ハマったこと)

  • ネット上の情報では説明が省略されているが、コマンドウインドウではactivatorの中にいるのかそうじゃないのかによってコマンドの書き方が違う。たとえばEclipseプロジェクトにするには"activator eclipse"と打てと大体のブログなどには書かれているが、すでにactivatorの中にいる場合には単に"eclipse"と打つだけ。そうじゃないと意味不明なエラーがでてくる。
  • バージョンに細かなところが違うっぽい。ここに書いた情報も現時点での最新バージョン同士の組み合わせなのでうまくいっているが、どこかのバージョンが変わるときっと全く同じ方法では動かなくなると思われる。特にaddSbtPluginの後ろの数字はPlayのバージョンではないので注意(勘違いしているサイトがいくつかあった)。sbteclipsenのサイト https://github.com/typesafehub/sbteclipse に行って、最新版の記述を確認すること。
  • ネット上の情報を鵜呑みにしないこと。特にEclipseまわりの設定はいろんな人が書いているわりにはプロジェクトを開くところで終わっていて、デバッグできるようにするところまでは説明しておらず「実際にそれで開発していないんだろうな」と思えるものが非常に多い。

まだ調べていないこと

  • Eclipse上で新しいファイルを追加した場合などにも自動的にそれらがEclipse上もPlay上も正常に実行(デバッグ)対象となり開発ができるのか。
  • Eclipse外で追加したファイルについてはどうなのか。
  • svnなどで他の開発者とソースを共有する場合に共有すべきファイルの範囲は?(Eclipseの設定ファイル類は共有してはならないはず)
  • Eclipse上に大量のjarファイルが出てくる。これをまとめられないか?→おそらくユーザライブラリにすればいいんだが、users\xxx.ivy2内の多数のサブディレクトリにあるのでちまちま選ぶのが面倒。そもそも全部いるのか?あとそもそも.ivy2にダウンロードされてそれをリンクするというのは微妙な気がする。プロジェクトごとにバージョン違うかもしれないし。
  • Firebirdで使えるか?→AnormがFirebirdに対応していないという情報があるが、最新のJayBirdでも同じかどうか確認。