§Play 2.2 遷移指南
這是從 Play 2.1 遷移至 Play 2.2 的指南。如果您需要從 Play 的較早版本進行遷移,則必須先遵循 Play 2.1 遷移指南。
§建置任務
§更新 Play 組織和版本
Play 現在已在不同的組織 ID 下發布。這是為了讓我們最終能將 Play 部署到 Maven Central。舊的組織 ID 為 play
,新的組織 ID 為 com.typesafe.play
。
版本也必須更新為 2.2.0。
在 project/plugins.sbt
中,更新 Play 外掛以使用新的組織 ID
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")
此外,如果您對 Play 人工製品有任何其他依賴項,而且您沒有使用輔助程式來依賴它們,您可能必須更新那裡的組織和版本號碼。
§更新 sbt 版本
project/build.properties
必須更新為使用 sbt 0.13.0。
§更新根目錄專案
如果您正在使用多專案建置,而且沒有任何專案的根目錄為目前的目錄,則根目錄專案現在會透過覆寫 rootProject 來決定,而不是依字母順序
override def rootProject = Some(myProject)
§更新 Scala 版本
如果您已設定 scalaVersion(例如,因為您有一個多專案建置,它使用 Project 以及 play.Project),您應該將它更新為 2.10.2。
§Play 快取模組
Play 快取現在已拆分為其自己的模組。如果您正在使用 Play 快取,您需要將它新增為依賴項。例如,在 Build.scala
中
val addDependencies = Seq(
jdbc,
cache,
...
)
請注意,如果您依賴於依賴於 2.2 之前 Play 版本的外掛,則會因為載入多個快取而導致快取內部發生衝突。如果您看到這個問題,請更新到較新的外掛版本或確保已排除較舊的 Play 版本。
§sbt 名稱空間不再延伸
sbt
名稱空間以前是由 Play 延伸的,例如 sbt.PlayCommands.intellijCommandSettings
。這被認為是不良做法,因此
Play 現在使用自己的命名空間來處理 sbt 相關事項,例如 play.PlayProject.intellijCommandSettings
。
§Scala 中的新結果結構
為了簡化動作組成和篩選,Play 結果結構已簡化。現在只有一個結果類型,SimpleResult
,之前有 SimpleResult
、ChunkedResult
和 AsyncResult
,加上介面 Result
和 PlainResult
。除了 SimpleResult
之外,所有其他類型都已棄用。Status
是 SimpleResult
的子類別,仍然存在作為建構結果的便利類別。在大部分情況下,動作仍然可以使用已棄用的類型,但會收到棄用警告。然而,執行組成和篩選的動作必須切換為使用 SimpleResult
。
§非同步動作
之前,您可能會有以下程式碼
def asyncAction = Action {
Async {
Future(someExpensiveComputation)
}
}
現在可以使用 Action.async
建構函式
def asyncAction = Action.async {
Future(someExpensiveComputation)
}
§處理分塊結果
之前,Status
上的 stream
方法用於產生分塊結果。這已被棄用,並替換為 chunked
方法,清楚說明結果將會分塊。例如
def cometAction = Action {
Ok.chunked(Enumerator("a", "b", "c") &> Comet(callback = "parent.cometMessage"))
}
直接建立或使用 ChunkedResult
的進階用法應替換為手動設定/檢查 TransferEncoding: chunked
標頭,並使用新的 Results.chunk
和 Results.dechunk
列舉的程式碼。
§動作組成
我們現在建議使用 ActionBuilder
實作來建立動作,以完成動作組合。
有關如何執行的詳細資訊,請參閱 此處。
§篩選器
EssentialAction
所產生的迭代器現在產生 SimpleResult
,而非 Result
。這表示需要使用結果的篩選器不再需要將 AsyncResult
解包成 PlainResult
,這可說讓所有篩選器更為簡單且容易撰寫。先前進行解包的程式碼通常可以用單一迭代器 map
呼叫取代。
§play.api.http.Writeable 應用程式
先前 SimpleResult
的建構函式會針對傳遞給它的 Enumerator
類型取得 Writeable
。現在該列舉器必須是 Array[Byte]
,而 Writeable
僅用於 Status
方便方法。
§測試
先前 Helpers.route()
和類似方法會傳回 Result
,這永遠會是 AsyncResult
,而 Helpers
上的其他方法,例如 status
、header
和 contentAsString
,會將 Result
作為參數。現在 Helpers.route()
會傳回 Future[SimpleResult]
,並由擷取方法接受。對於許多常見的用例,其中會使用類型推論來判斷類型,測試程式碼不應需要變更。
§Java 中的新結果結構
為了簡化動作組合,Java 的結果結構已變更。AsyncResult
已棄用,而 SimpleResult
已導入,以區別一般結果與 AsyncResult
類型。
§非同步動作
先前,非同步動作中的未來必須包覆在 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>
。如果沒有對結果做任何事,通常唯一的必要變更就是更新類型簽章。
§Iteratee 執行內容
現在,執行應用程式提供程式碼的 Iteratee、列舉器和枚舉器需要一個暗示執行內容。例如
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
類別中。只要將 OrderedExecutionContext
提供為 F.Promise
的任何方法的引數,就可以輕鬆重建 Play 2.1 的舊有行為。
以下程式碼顯示如何在 Play 2.2 中重建 Play 2.1 的行為。請注意,這個範例使用與 Play 2.1 相同的設定:在 Play 的預設 ActorSystem
中執行的 64 個 Actor 池。
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,這表示套件名稱現在是 com.fasterxml.jackson.core
,而不是 org.codehaus.jackson
。
§準備發行版
stage 和 dist 任務已在 Play 2.2 中完全重新編寫,以便使用 Native Packager 外掛程式。
Play 發行版不再建立在專案的 dist
資料夾中。它們會建立在專案的 target
資料夾中。
另一個已變更的項目是啟動 Play 應用程式的 Unix 腳本位置。在 2.2 之前,Unix 腳本名稱為 start
,且位於發行版的根目錄資料夾中。在 2.2 中,start
腳本會根據專案名稱命名,且位於發行版的 bin
資料夾中。此外,現在有一個 .bat
腳本可供在 Windows 上啟動 Play 應用程式。
請注意,傳遞給
start
腳本的引數格式已變更。請在start
腳本上執行-h
,以查看現在接受的引數。
請參閱 "在生產模式中啟動應用程式" 文件,以取得有關新的 stage
和 dist
任務的更多資訊。
§從 Akka 2.1 升級到 2.2
從 Akka 2.1 升級到 2.2 的遷移指南可以在 此處 找到。
下一步:Play 2.1
在此文件中找到錯誤?此頁面的原始程式碼可以在 此處 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇,與社群展開對話。