Play2.0で自作プラグインを書く
motivation
Play2.0ではプラグインの書き方の資料はありません。MLを見てる感じだとsbtのsubprojectとして
プラグインを書くのが一般的のようです。他のモジュールを参考にして、github上に
書き方
- sbtの構成で書く
現状のModuleはフォルダ構成がまちまちなのですが、今後を考えるとsbtの構成で書くようにした方が良さそう
. ├── build.sbt ├── project │   ├── plugins.sbt ├── src │   └── main │   └── scala │   └── com │   └── github │   └── masahitojp │   └── play2 │   └── sample │   └── SamplePlugin.scala └── version.sbt
- SamplePluginの書き方
Scalaでの書き方を説明します。play.api.Pluginを継承します。
Play!1.Xではたくさんのフックイベントが存在するのですが、2.Xではいまのところ
onStart/onStop/enabledのみ使えます。
package com.github.masahitojp.play2.sample import play.api._ class SamplePlugin(val app: Application) extends Plugin { val name = "sample" // 起動時に実行される override def onStart() { Logger.info("sample on start") } // アプリケーション終了時に実行 override def onStop() { Logger.info("sample on end") } // アプリケーションの有効フラグ override def enabled() = !app.configuration.getString("SamplePlugin") .filter(_ == "disabled").isDefined }
- 公開する
他のモジュールではSonatypeを使ってmaven projectを使うのが一般的みたい。
公開の仕方はこちらを参考にすると良いです。
なおpgp用のキーの作成が必要です。
また、sonatypeを使う場合はbuild.sbtに以下の行を加えておくと良い用です。
// Configuration required for deploying to sonatype publishMavenStyle := true publishTo <<= version { (v: String) => val nexus = "https://oss.sonatype.org/" if (v.trim.endsWith("SNAPSHOT")) Some("snapshots" at nexus + "content/repositories/snapshots") else Some("releases" at nexus + "service/local/staging/deploy/maven2") } pomIncludeRepository := { _ => false } publishArtifact in Test := false pomExtra := ( <url>http://github.com/masahitojp/play2-sample-module</url> <inceptionYear>2012</inceptionYear> <licenses> <license> <name>Apache 2</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> <comments>A business-friendly OSS license</comments> </license> </licenses> <scm> <url>[email protected]:masahitojp/play2-sample-module.git</url> <connection>scm:git:[email protected]:masahitojp/play2-sample-module.git</connection> </scm> <developers> <developer> <name>Nakamura Masato</name> <email>[email protected]</email> <url>http://masahito.me/</url> <roles> <role>Author</role> </roles> <organization>Nakamura Masato</organization> </developer> </developers>)
導入の仕方
- project/Build.scala
val appDependencies = Seq( // Add your project dependencies here, "com.github.masahitojp" %% "play2-sample-module" % "1.0.0-SNAPSHOT" ) val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings( // Add your own project settings here resolvers += "Sonatype OSS Snapshots Repository" at "http://oss.sonatype.org/content/groups/public" )
- conf/play.pluginを書く
優先度:使いたいplginのクラス
優先度は小さいほど先に実行されるようです。
10000:com.github.masahitojp.play2.sample.SamplePlugin
summary
まだsbtについてはちゃんと理解できていませんが、pluginの書き方は理解できました。
本当は こちら の用にgithubから直接
取得する方法を調べたのですが、うまく行きませんでした。こちらは後で追加調査する予定です。
先人に感謝。