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>git@github.com:masahitojp/play2-sample-module.git</url>
<connection>scm:git:git@github.com:masahitojp/play2-sample-module.git</connection>
</scm>
<developers>
<developer>
<name>Nakamura Masato</name>
<email>randomstep@gmail.com</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から直接
取得する方法を調べたのですが、うまく行きませんでした。こちらは後で追加調査する予定です。
先人に感謝。