Documentation

§Play 2.2 移行ガイド

これは Play 2.1 から Play 2.2 への移行ガイドです。これより古いバージョンの Play から移行する場合は、まず Play 2.1 移行ガイド の内容に従ってください。

§ビルドタスク

§Play 組織とバージョンの更新

Play はこれまでと異なる organization id の元に公開されるようになりました。これにより、ようやく Play を Maven Central に配置することができます。古い organization id は play で、新しい id は com.typesafe.play です。

バージョンも 2.2.0 にアップデートする必要があります。

新しい organization id を使って project/plugins.sbt 中の Play プラグインを更新してください:

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")

さらに、もし何か Play の artifact に依存するものがあり、ヘルパーを使わずに依存している場合、それらの organization id とバージョン番号を更新する必要があるかもしれません。

§SBT バージョンの更新

sbt 0.13.0 を使うように project/build.properties を更新する必要があります。

§root プロジェクトの更新

sbt のマルチプロジェクトビルドを使っていて、このプロジェクトの root ディレクトリを指定した project が存在しない場合、root プロジェクトはアルファベット順で決められる代わりに、rootProject で上書きして設定することができるようになりました:

override def rootProject = Some(myProject) 

§Scala バージョンの更新

(例えば play.Project に加えて、Project を使うマルチプロジェクトビルドがある場合など) 複数の scalaVersion がある場合、2.10.2 に更新してください。

§Play キャッシュモジュール

Play キャッシュは独自モジュールに切り出されました。Play キャッシュを使っている場合は、依存性として追加する必要があります。例えば、次のように Build.scala に追加します:

val addDependencies = Seq(
  jdbc,
  cache,
  ...
)

Play 2.2 以前のバージョンに依存するプラグインに依存している場合、複数のキャッシュ機能がロードされることになるため、衝突が発生することに注意してください。この問題が発生した場合は、プラグインを最新化するか、古いバージョンの Play が確実に除外されるようにしてください。

§sbt 名前空間を継承しない

これまで sbt 名前空間は、例えば sbt.PlayCommands.intellijCommandSettings のように Play によって継承されていました。これはバッドプラクティスと考えられているので、
今後 Play は sbt に関するものに、例えば play.PlayProject.intellijCommandSettings のような独自の名前空間を使います。

§Scala における新しい構造の Result

アクション合成とフィルターを簡素化するために、Play の Result 構造はシンプルになりました。以前は SimpleResult, ChunkedResult そして AsyncResult に加えて Result および PlainResult インタフェースがありましたが、Result の型は SimpleResult ただひとつになります。SimpleResult を除いて、すべて非推奨になりました。SimpleResult のサブクラスである Status は、Result を組み立てるために便利であるため、まだ残っています。ほとんどの場合において、アクションは非推奨となった型をまだ使うことができますが、非推奨の警告が表示されるでしょう。合成またはフィルターを行うアクションはどうにかして SimpleResult を使うように切り替える必要があります。

§非同期アクション

以前は次のように書く必要のあったところで:

def asyncAction = Action {
  Async {
    Future(someExpensiveComputation)
  }
}

Action.async ビルダを使えるようになります:

def asyncAction = Action.async {
  Future(someExpensiveComputation)
}

§チャンクした Result を使う

これまで Status クラスの stream メソッドはチャンクされた Result を生成するために使われました。これは非推奨となり、Result がチャンクされることを明確にする chunked メソッドで置き換えられます。例えば:

def cometAction = Action {
  Ok.chunked(Enumerator("a", "b", "c") &> Comet(callback = "parent.cometMessage"))
}

直接 ChunkedResult を作ったり使ったりする高度な使い方は、手動で TransferEncoding: chunked ヘッダーを設定/チェックし、そして新しい Results.chunkResults.dechunk enumeratee を使うコードで置き換えられるべきです。

§アクション合成

アクションを合成する際は、アクションを組み上げるために実装された ActionBuilder を使うことをお勧めします。

やり方の詳細は ここ で読むことができます。

§フィルタ

EssentialAction により生成される iteratee は、Result の代わりに SimpleResult を生成します。これは Result と動作する必要のあるフィルターは、もう AsyncResultPlainResult にアンラップする必要がないことを意味し、間違いなくすべてのフィルターをシンプルに、そして簡単に書けるようにします。これまでアンラップを行っていたコードは、大抵の場合、map を呼び出すひとつの iteratee で置き換えることができます。

§play.api.http.Writeable の適用

これまで SimpleResult のコンストラクタは Enumerator 型に渡される Writeable を受け取りました。これからは enumerator は Array[Byte] でなければならず、Writeable は便利な Status メソッドのためだけに使われます。

§テスト

これまで Helpers.route() や、その実体は常に AsyncResult である Result を返す同様のメソッド、そして status, header および contentAsString などの Helpers のメソッドは、引数に Result を受け取りました。これからは Helpers.route() から Future[SimpleResult] が返されて、抽出メソッドに受け入れられます。一般的なユースケースとして、型を決定するために型インタフェースが使われている箇所については、テストコードを変更する必要はありません。

§Java における新しい構造の Result

アクションの合成をシンプルにするために、Java の Result 構造 は変更されました。AsyncResult は非推奨になり、通常の Result を AsyncResult 型とはっきり区別するために SimpleResult が導入されました。

§非同期アクション

これまで、非同期アクション内の future は async 呼び出しのなかにラップしなければなりませんでした。これからは、アクションは Result または Promise<Result> のいずれかを返します。例えば:

public static Promise<Result> myAsyncAction() {
  Promise<Integer> promiseOfInt = Promise.promise(
    new Function0<Integer>() {
      public Integer apply() {
        return intensiveComputation();
      }
    }
  );
  return promiseOfInt.map(
    new Function<Integer, Result>() {
      public Result apply(Integer i) {
        return ok("Got result: " + i);
      }
    }
  );
}

§アクション合成

play.mvc.Action にある call メソッドのシグネチャは Promise<SimpleResult> を返すように変更されました。Result に対してなにもしていない場合に必要となる変更は、通常は型のシグネチャを更新することだけです。

§コンテキストを実行する Iteratee

アプリケーションが提供するコードを実行する iteratee, enumeratee そして enumerator は、暗黙のコンテキストを要求するようになります。例えば:

import play.api.libs.concurrent.Execution.Implicits._

Iteratee.foreach[String] { msg =>
  println(msg)
}

§F.Promise の並列実行

ユーザより提供されたコードを F.Promise クラスが実行する方法は、Play 2.2 で変更されました。

Play 2.1 の F.Promise は、ユーザーコードの実行に制限を加えていました。与えられた HTTP リクエストに対する Promise の操作は、登録された順番に、本質的にはシーケンシャルに実行されるものでした。

Play 2.2 において、この順序性の制限は取り除かれ、promise の操作は平行して実行できます。F.Promise クラスによって実行される作業は、実行に一切の制限を加えること無しに Play のデフォルトスレッドプール を使うようになります。

一方、いまだに Play 2.1 の古めかしい振る舞いは、それを望むひとのために OrderedExecutionContext クラスに保持されています。Play 2.1 の古めかしい振る舞いは、F.Promise のあらゆるメソッド引数に OrderedExecutionContext を渡すことで、簡単に再現することができます。

以下に示すのは、Play 2.2 で Play 2.1 の振る舞いを再現するコードです。この例は Play 2.1 と同様の設定を使うことに注意してください。64 個のアクターのプールは Play デフォルトの ActorSystem 内で実行されます。

import play.core.j.OrderedExecutionContext;
import play.libs.Akka;
import play.libs.F.*;
import scala.concurrent.ExecutionContext;

ExecutionContext orderedExecutionContext = new OrderedExecutionContext(Akka.system(), 64);
Promise<Double> pi = Promise.promise(new Function0<Double>() {
  Double apply() {
    return Math.PI;
  }
}, orderedExecutionContext);
Promise<Double> mappedPi = pi.map(new Function<Double, Double>() {
  Double apply(x Double) {
    return 2 * x;
  }
}, orderedExecutionContext);

§Jackson Json

Jackson のバージョンを 2 にアップグレードしました。これは、パッケージ名が org.codehaus.jackson ではなく com.fasterxml.jackson.core になることを意味します。

§配布物の準備

stage および dist タスクは Play 2.2 で Native Packager Plugin を使うように完全に書き換えられました。

今後、Play の成果物はプロジェクトの dist フォルダには出力されません。その代わりに、プロジェクトの target フォルダに作成されます。

その他に、Play アプリケーションを起動する Unix スクリプトの場所が変更されています。2.2 以前、この Unix スクリプトは start という名前で配布物フォルダの最上位層に置かれていました。2.2 では、このスクリプトはプロジェクトごとの名前を持ち、配布物の bin フォルダに置かれます。さらに、Windows 上で Play アプリケーションを起動することができる .bat スクリプトもそこに置かれます。

start スクリプトに渡していた引数のフォーマットが変更されていることに注意してください。start スクリプトに -h を渡して、受け付けられる引数を確認してください。

新しい stage および dist タスクのより詳しい情報については、ドキュメント "本番モードでアプリケーションを起動する" を参考にしてください。

§Akka を 2.1 から 2.2 へアップグレード

Akka を 2.1 から 2.2 へアップグレードする移行ガイドは、ここ にあります。

Next: Play 2.1 移行ガイド


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。