§Scala 3 移行ガイド
このガイドは、PlayアプリケーションをScala 2からScala 3に移行するためのものです。アプリケーションは、すでにPlay 2.9(Akka / Akka HTTP上に構築)またはPlay 3.0(Pekko / Pekko HTTP上に構築)以上で実行されている必要があります。
コードベースによっては、既存のPlayアプリケーションをScala 3に移行するには、かなりの作業が必要になる場合があります。最初にScala 2.13のまま、Play 2.9または3.0に移行することを強くお勧めします。このアプローチにより、すべてが意図したとおりに機能することが保証されます。その後、Scala 3に移行できます。
§概要
このページに記載されているPlay FrameworkアプリケーションをScala 3に移行するために必要な手順に加えて、コードベースをScala 3に移行するために従うべき一般的なScala 3リソースがあります。
§プロジェクトでの `scalaVersion` の設定
**ScalaユーザーとJavaユーザーの両方**は、Scala 3を使用するようにsbtを設定する必要があります。プロジェクトにScalaコードがない場合でも、Play自体はScalaを使用するため、適切なScalaライブラリを使用するように設定する必要があります。
sbtでScalaバージョンを設定するには、`scalaVersion`キーを設定します。例:
scalaVersion := "3.3.3"
PlayはScala LTS(長期サポート)バージョンのみをサポートしていることを強調することが重要です。そのため、Scala 3.3 LTSと次のLTSバージョンの間のScalaリリースは、Playで公式にサポートされません。ただし、そのようなScalaバージョンでPlayを使用することは依然として可能かもしれません。「Scala 3 compatibility story」とScala 3.3リリースブログ記事に興味があるかもしれません。
§Akka HTTP 10.5以降でのScala 3の使用
このセクションはPlay 2.xにのみ適用され、Play 3.xには適用されません。
Play 2.9のハイライトで述べたように、Play 2.9は、新しいバージョンが利用可能であるにもかかわらず、Akka 2.6とAkka HTTP 10.2を出荷し続けています。
ただし、Akka HTTP 10.2はScala 3アーティファクトを提供していません。Akka HTTP 10.5でのみ導入されました。Akka HTTPでこれらのネイティブScala 3アーティファクトを使用したい場合、したがってAkka HTTP 10.5以降にアップグレードしたい場合は、Play ScalaまたはPlay Javaの更新ガイドを使用して行うことができます。これらのガイドでは、Scala 3でAkka HTTP 10.5以降を使用するために調整する必要がある設定についても説明しています。また、次の内容を確認することを強くお勧めします。
§特定のテストに必要な `running()` ラッパー
§specs2の使用
specs2の`Around`トレイトは、Scalaの`DelayedInit`を使用しています。これはScala 3で削除されました(実際には削除されていません。何も実行されなくなりました)。残念ながら、Scala 3には`DelayedInit`の代替手段がありません。したがって、specs2でテストを作成する際に
を使用する場合、ユーザーがテストを完全にリファクタリングする必要がないように、解決策を考え出す必要がありました。私たちが考え出した解決策は、テストを`running()`メソッドでラップすることです。これは、移行コストをかけずにこれらのテストを移行する最も簡単な方法だと考えているためです。たとえば、`WithApplication`の場合、次のようなコード
"testing some logic" in new WithApplication {
// <test code>
}
は、次のように記述する必要があります。
"testing some logic" in new WithApplication {
override def running() = {
// <test code>
}
}
ラッパーメソッドを使用する利点は、Scala 2でも動作するようにしたことです。そのため、Scala 2のテストは`running()`でラップすれば実行されるため、このようなテストコードはScala 2/3から/に簡単に切り替えることができ、テストは両方の場合で動作します(移行中に役立つ場合があります)。
§ScalaTest *Plus* Playの使用
ScalaTestでテストを作成する際に、App、Server、Chrome、Firefox、HtmlUnit、InternetExplorer、またはSafariを使用する場合は、Scala 3で動作させるために、テストコードを`running()`メソッドでラップする必要があります。これは、内部でScalaTestも`DelayedInit`を使用しているためです。前のセクションで説明したとおりです。たとえば、`App`を使用する場合、次のようなコード
"testing some logic" in new App(...) {
// <test code>
}
は、次のように変換する必要があります。
"testing some logic" in new App(...) {
override def running() = {
// <test code>
}
}
§文字列補間ルーティングDSL(sird)のインポート
暗黙のクラス `play.api.routing.sird.UrlContext`からいくつかのメソッドを分割し、代わりに拡張メソッドを使用する必要がありました。
つまり、`UrlContext`クラスを直接インポートした場合
import play.api.routing.sird.UrlContext
拡張メソッドもインポートされるように、代わりに`sird`パッケージからすべてをインポートする必要があります。
import play.api.routing.sird._
§依存関係グラフの変更
PlayアプリケーションでScala 3の使用を開始すると、Play `specs2` 依存関係は`"org.specs2" %% "specs2-mock"`依存関係をプルしなくなります。これは、Scala 3では利用できなくなったためです。Play `specs2` Scala 3アーティファクトは、代わりに`"org.mockito" % "mockito-core"`に依存してMockitoを直接使用します。これは、この時点では既存のテストコードを切り替えるための最良の代替手段であると考えています。
コードを調整する必要があります。たとえば、Mockitoを使用する方法の例を次に示します。
import org.mockito.Mockito._
import org.mockito.ArgumentMatchers._
val userRepository = mock(classOf[UserRepository])
when(userRepository.roles(any[User])).thenReturn(Set(Role("ADMIN")))
**次:** モジュールディレクトリ
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。