Keep on moving

あんまりまとまってないことを書きますよ

Play2.0で自作プラグインを書く

motivation

Play2.0ではプラグインの書き方の資料はありません。MLを見てる感じだとsbtのsubprojectとして
プラグインを書くのが一般的のようです。他のモジュールを参考にして、github上に

reference

日本語ではこの情報が一番詳しい

mongodb jackson mapper pluginの作者のブログ

プラグイン周りの本体側コードの説明。わかりやすい

書き方

  1. sbtの構成で書く

現状のModuleはフォルダ構成がまちまちなのですが、今後を考えるとsbtの構成で書くようにした方が良さそう

.
├── build.sbt
├── project
│   ├── plugins.sbt
├── src
│   └── main
│       └── scala
│           └── com
│               └── github
│                   └── masahitojp
│                       └── play2
│                           └── sample
│                               └── SamplePlugin.scala
└── version.sbt
  1. 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
}
  1. 公開する

他のモジュールでは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>)

導入の仕方

  1. 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"
    )
  1. conf/play.pluginを書く

優先度:使いたいplginのクラス

優先度は小さいほど先に実行されるようです。

10000:com.github.masahitojp.play2.sample.SamplePlugin

summary

まだsbtについてはちゃんと理解できていませんが、pluginの書き方は理解できました。
本当は こちら の用にgithubから直接
取得する方法を調べたのですが、うまく行きませんでした。こちらは後で追加調査する予定です。
先人に感謝。