Blog

Play + SBTでプロジェクト分割管理


どうも。GameTailorの松川です。

GameTailorではPlayFrameworkを利用したWebアプリケーションや,
Elastic MapReduceを利用したBatch アプリケーション等、
複数のアプリケーションから同一のDomain層、Infrastructure層、Utilsの実装、共通設定を使いまわせるように
SBTのマルチプロジェクトを利用してます。

 

今回は簡単にAppからUtilsの実装を利用するマルチプロジェクトを作成しながら、GameTailorでの管理方法をご紹介します。

 

1. Rootプロジェクト作成

複数のプロジェクトを統括管理するrootプロジェクトを作成します。

1-1. rootプロジェクト作成

2-1. PlayPluginの設定を追加

rootプロジェクトからPlayのサブプロジェクトを定義できるようplay-pluginの設定を追加

2. Web App実装

rootプロジェクトのモジュールとして”Hello play app!”と出力するだけの簡単なPlayアプリケーションを作成していきます。

2-1.play application作成

2-2.HelloPlayApp実装

2-3.routesへ設定追加

2-4.動作確認

3. HelloPlayAppのbuild設定をrootプロジェクトのbuild.sbtへ記述

続いて、modules/hello-play-appをrootプロジェクトから管理するよう設定を入れていきます

3-1. build.sbt設定

※ここではbuild.sbtに記述していますが、.scalaファイルに定義する方法もあります。細かい内容は公式へ譲るとして、gameTailorでは長くなった設定(Dependencisや共通の基本設定)を.scalaへ記述し、build.sbtへimportして利用しています。

3-2. HelloAppのbuild.sbtを削除

rootプロジェクトで管理するのでここのbuild.sbtは削除しておきます。

4. HelloUtills実装

続いて、HelloPlayAppから利用するHelloUtilsを実装します。
ここは非Playで実装してきます

pimp my libraryで現在時間の文字列を末尾に追加して返すメソッドを実装

5. マルチプロジェクト化

5-1. HelloAppにHelloUtilsを依存させる

dependsOnで依存関係を持たせることができます。

※dependsOnした子プロジェクトから親プロジェクトへの参照はできません。

これを利用し、GameTailorでは下位のプロジェクトが上位のプロジェクトへ依存することを制限しています。

GameTailorプロジェクト全体図

スクリーンショット 2015-07-06 1.09.18

 

5-2. helloPlayAppにhelloUtilsを利用する実装を追加

5-3. 動作確認

helloPlayAppプロジェクトを指定してrunする必要があります

5-3-1. sbtのインタラクティブモードでプロジェクト一覧を確認

5-3-2. helloPlayApp プロジェクトを選択し、runを実行

※sbt ‘project helloPlayApp’ runでも可

5-3-3. 実行

 

ここまでで簡単にですが、play プロジェクトをマルチプロジェクト構成で利用してみました。
コード→https://github.com/ma2k8/sbt-multiple-project-example

コードを簡単に共有することができるので、インフラストラクチャ層、ドメイン層のコードを別プロジェクトとして管理すると捗ると思います。

別プロジェクトのコードもPlayに依存させて使うこともでき、その場合はenablePluginするだけです。

6.Test

testはjavaOptionsでconfを指定する設定を.settingsでプロジェクトに定義しています。

7. Deploy

GameTailorではプロジェクトごとにgitで管理しており、rootプロジェクトからgit subtreeで紐付けています。

subtreeによって以下のフローでリポジトリ個別のデプロイを行っています。

※subtree pushは変更のあったファイルに属するリポジトリにコミット内容をpushしてくれるので、各リポジトリごとにhookすることができます。

こうすることにより、rootPjを管理するリポジトリへのみコミットすれば良いので開発フローをシンプルに保つことができます。

8. プロジェクトごとに違うScalaバージョンでビルドしたい場合

GameTailorではSpark on Emrのバッチもマルチプロジェクトで管理しています。

Sparkの推奨scala versionが2.10系なので2.11系のプロジェクトとバッティングしてしまいます。。

これはsbt実行時のscalaVersion指定でjar化し、2.10系でビルドできないコードはmergeStorategyで省くことで解決することが出来ました。sbt素晴らしいですね。

 

駆け足でGameTailorでのプロジェクト管理方法について紹介させていただきました。

プロジェクトはムダのない構成のほうが愛着も湧きますし、実装も熱が入ります。少しでも皆様の参考になれば嬉しいです。

それでは。

 

 

Copyright about logo
Copyright (c) 2002-2015 EPFL

Author

アバター
admin