2013年6月22日土曜日

[Play] Play 2.0.3 から Play 2.1.1 へバージョンアップ

最近 これまで使っていた Play 2.0.3 のバージョンを変えていなかったので、 Play 2.1.1 にバージョンアップしたらいろいろ動かなくなった。
そもそもコンパイルが通らない。

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: play#sbt-plugin;2.0.3: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn]  Note: Some unresolved dependencies have extra attributes. 
 Check that these dependencies exist with the requested attributes.
[warn]   play:sbt-plugin:2.0.3 (sbtVersion=0.12, scalaVersion=2.9.2)
[warn]
sbt.ResolveException: unresolved dependency: 
play#sbt-plugin;2.0.3: not found

いくつか手を入れないといけなかったのでメモ。


build.properties と plugins.sbt の修正


まずは、project ディレクトにある build.propertiesplugins.sbt に記載されている sbt と sbt-plugin のバージョンを修正する。

build.properties

sbt.version=0.12.2

plugins.sbt

// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository 
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.1")

もとの値は 0.11.32.0.3
Migration Guide には sbt-plugin は 2.1.0 と記載されているが、 これは Play 2.1.0 の情報で今入れている Play は 2.1.1 なので、 sbt-plugin は 2.1.1 を指定する。

Play new hoge で新規にプロジェクトを作ってそこからコピーするのが確実。


Build.scala の修正


project ディレクトにある Build.scala を修正する。

Play 2.0 の PlayProject オブジェクト が Play 2.1 で play.Project に変更になり、apply() の引数も変わったことに対する対応をする。
dependencies も jdbc と anorm を明示的に指定する必要があるようになったのでこれも対応する。

Build.scala

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "sessiontest"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    jdbc, anorm
  )

  val main = play.Project(
      appName, appVersion, appDependencies).settings(
    // Add your own project settings here      
  )
}


play.Project() の引数は、Play 2.0 では第4引数に mainLang = SCALA を指定していたが、 これはなくなった。

あとは、play clean をして play run で動くはずなのだが、 Play 2.0 でのコンパイル済のファイルが残っている影響か、以前 eclipsify した影響か play.Project が見つからない旨のエラーがでて Build.scala のコンパイルに失敗するので、 .cache、.project、.classpath、.settings/、.target/、bin、target、project/project、project/target など、 Play 2.1 で存在しない2次的なファイルやフォルダを消すことで動作することができるようになった。

他にも Scala のバージョンが変わったことによる対応などが必要なこともあるようだが、 今回はこれだけで移行できた。
その他の詳細は上記のリンク先を参照。

無理に互換性がなくなるような変更をしなくてもよさそうな内容なのだが、 まだまだ発展途上でいろいろ変わるよ、ということなのだろうか?


play.Project の謎


Build.scala の play.Project() のところは、 単に Project と書いても動きそうなものだが、引数の型が違うというエラーになり、 コンパイルが通らない。
どうもほかのクラス(オブジェクト)として解釈されているようだ。 気になったので調べてみた。

Build.scala の main の中身を少し細工して何が生成されているのかを見てみた。

  val main = {
    
    val proj = play.Project(appName, appVersion, appDependencies).settings(
      // Add your own project settings here      
    );
    val name = Project("aaa", null).getClass().getName();
    println (name);
    proj;
  }

sbt.Project$$anon$1

sbt.Project だった。
一般名詞にしてバッティングするなら、PlayProject にしておけばいいのに・・・

0 件のコメント:

コメントを投稿