初めまして!アリクイです。イギリス人ですけど、日本の文化に興味を持って3年前日本に来て、鳥取県で英語を教えるかたわら日本語を勉強しました。鳥取でエンジニアの仕事は少ないので東京に引っ越して、今年の5月からナイルで働いてます。宜しくお願いします!

たまに二つのプロジェクトでコードを共有したいです。別々でコンパイルしたいし、別のサーバーでデプロイしたいし、同じプロジェクト中で混ぜたくないです。例えば、

  • 二つのプロジェクトは同じデータベースを使ってます。DAOは2回作りたくない時
  • 管理画面は本サイトと同じモデルとヘルパーを使いたいですが、別の認証があるサーバーでデプロイしたい時
  • 大きいプロジェクトで独自なライブラリーを別のところでまとめたい時

Play 2.4でこの問題を解決したい時、サブプロジェクトが使えます。サブプロジェクトを”subprojects”のフォルダーに入れたら、build.sbtのファイルで依存を定義できます。簡単なブログアプリのために管理画面のサブプロジェクトを作成する例を見ましょう。

この説明のコードは私のGithubのアカウントに入ってます。完成されたサブプロジェクトは「subprojects-example」というブランチに入ってます。

https://github.com/jamesneve/simple_blog2

blog_post_image

このアプリはブログポストを見ることができます。アカウントを登録してログインすれば、投稿できます。

サブプロジェクトを作成

Play 2.4のサブプロジェクトは「subprojects」というフォルダーに置きます。管理画面のために二つのサブプロジェクトを作ります。commonは共有するデータを置く場所です。そして、adminというサブプロジェクトに管理画面のファイルを置きます。とりあえず、commonを作って、build.sbtファイルを作ります。commonという名前をつけたら、ルートのアプリケーションから

build_sbt

内容はルートプロジェクトに似ていますけど、commonは独自で走らないようにproject in fileは書かなくてもいいです。

自分の好きなデータベースとコンパイラー設定はもちろん変更しても大丈夫です。

ルートプロジェクトのbuild.sbtに

を追加しましょう。activator compileを流したら、こんな感じになります、、、

commonとrootは両方コンパイルされたので、成功でした。Playがちゃんと動くように、project/pluginsのファイルも追加しましょう。

sbt_plugins

pluginsはsbt-pluginが大事ですが、ルートプロジェクトと同じ内容で大丈夫です。

同じ感じでadminを設定しましょう。adminはrootと一緒にコンパイルしないので、rootみたいにdependsOn(common)を書きます。plugins.sbtはcommonと同じ感じで設定します。

ルートのbuild.sbtでサブプロジェクトを定義しなきゃいけないです。

activatorのコンソルから「project [name]」を使えば、プロジェクトが変えることができます。clean compileをする時、rootはadminのプロジェクトをコンパイルしないように確認しましょう。

commonにコードを移動

次の作業は共有したいファイルをcommonのプロジェクトに移動することです。package名は元々の名前プラスサブプロジェクト名は普通です。例えば、modelsはmodels.commonになります。importを全部更新するのは辛いです、、、

move_classes

ファイルだけじゃなくて、ルートもアセットも共有したい時があります。こうするために、common/conf/common.routesのファイルを作りましょう。下の内容を入れてみましょう。

rootのプロジェクトのroutesファイルにこの内容も追加

今の設定で、アセットをcommon/publicに移動すれば表示されないです。なぜかというと、controllers.common.Assetsというコントローラーは存在していないです。それに、commonはrootの前にコンパイルされて、controllers.Assetsの存在について知らないです。解説するために、common/app/controllersのなかでcontrollers.common.Assetsを作りましょう。PlayのAssetsBuilderをextendすれば済みます。

イメージとスプレッドシートをcommonに移動すれば、ちゃんと表示されます。これを定義してから、app/assets/stylesheets/main.cssをsubprojects/common/app/assets/stylesheets/main.cssに移動できました。

stylesheets

管理画面を作成

最後に、adminの環境を設定しましょう。adminは独自でコンパイルしたいので、commonと比べてもっと必要です。とりあえず、admin/conf/application.confを作りましょう。だいたいrootのapplication.confの内容と同じで大丈夫ですが、ルートのファイルはディファウルトじゃないです。

上のコンフィグを追加する必要があります。ルートファイルも変更しましょう。例として、ユーザーを全部見る画面を作りたいです。admin/conf/admin.routesのなかでこの内容を追加します。

そして普通にrootプロジェクトみたいにadminをpackage名に追加すれば普通に開発できます。

controllers/userManagementController.scala

views/layouts/admin.scala.html

スタイルシートのルートははっきりと見てみてください。routes.Assets.versionedだけじゃなくて、コントローラー名も書かなきゃいけないです。

views/users/index.scala.html

画面を見たければ、activatorを起動してから、前みたいにproject adminを使ってadminプロジェクトを選択します。そして普通にrunで起動できます。localhost:9000/usersに行けば、ユーザーの画面が見れます。

 users

このアプリは「James」と呼ばれるユーザーが二人いるみたいです ^^;

管理画面ログイン機能がまだないし、ユーザーの編集機能は実装してないし、いろんな仕事はまだやらなきゃいけないです。ただ、これを読んだら簡単なPlay 2.4のサブプロジェクト設定がわかるようになったと祈ってます。

コード:https://github.com/jamesneve/simple_blog2/tree/subprojects-example