13

SBT とそのプラグインで使用される Scala のバージョンを変更する必要はありますか?

Play Framework 2.1.1-RC2 を使用しています。Scala 2.10.1 を使用する新しいプロジェクトを作成したいと考えています。それを達成するために、私は次のことをしました

  • 追加された依存"org.scala-lang" % "scala-compiler" % "2.10.1"関係Build.scala
  • 変数scalaVersionを 2.10.1 に初期化Build.scala

次にplay about、コマンドを実行し、次の出力を得ました

[test2] $ about
Getting Scala 2.10.1 ...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.10.1/scala-compiler-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-compiler;2.10.1!scala-compiler.jar (7401ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.10.1/scala-library-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-library;2.10.1!scala-library.jar (4309ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.10.1/scala-reflect-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-reflect;2.10.1!scala-reflect.jar (2144ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.10.1/jline-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#jline;2.10.1!jline.jar (201ms)
:: retrieving :: org.scala-sbt#boot-scala
        confs: [default]
        5 artifacts copied, 0 already retrieved (24386kB/58ms)
[info] This is sbt 0.12.2
[info] The current project is {file:/C:/work/test_projects/test2/}test2
[info] The current project is built against Scala 2.10.1
[info] Available Plugins: play.Project, sbt.PlayProject, com.typesafe.sbteclipse.plugin.EclipsePlugin, com.typesafe.sbtidea.SbtIdeaPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2

最後の行は私が気になるものです。Scala 2.9.2が使用されていると書かれています。どうすればそれを変更できますか? コードのコンパイル使用されるバージョンに影響しますか?

更新:コンパイラのバージョンを変更するこの方法が正しく機能しなかったようです。アプリを実行した後、プレイ コンソールに次の警告が表示されます。

[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
[info] Compiling 5 Scala sources and 1 Java source to C:\work\test_projects\test2\target\scala-2.10\classes...
[info] 'compiler-interface' not yet compiled for Scala 2.10.1. Compiling...
[info]   Compilation completed in 8.608 s
[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
[info] play - Application started (Dev)
[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
4

2 に答える 2

13

SBT は Scala アプリケーションであり、すべての Scala アプリケーションと同様に、Scala のバイナリ互換性規則に従う必要があります。具体的には、バージョン 2.8、2.9、および 2.10 は相互に互換性がありません。

つまり、Play で使用される SBT バージョンは Scala 2.9.2 でコンパイルされているため、すべてのプラグインとすべてのプロジェクト定義は別の 2.9.x バージョンでコンパイルする必要があります。これは、yourBuild.scalaが単に SBT によって実行されるものではなく、SBT 実行の一部になるためです。

ただし、これは、アプリケーションをコンパイルする必要がある Scala のバージョンとはまったく関係ありません。SBT は任意の Scala バージョンを使用でき、同時に複数の Scala バージョンを生成することもできます。これが、Scala ライブラリが複数の Scala バージョンのバイナリを提供する方法です。

于 2013-03-28T05:18:31.300 に答える
11

私の実験の最終的な目標は、プロジェクトのビルドに使用する Scala コンパイラのバージョンを変更することでした。

何度も試みた後、私はそれをうまく達成することは不可能であると結論付けました. これは、Play Framework の作成者が取り組むべきことだと思います。

Build.scala に設定scalaVersion2.10.1-localてもあまり役に立ちませんでした。SBT は Maven/Ivy に行き、私が望まない 2.10.0 の一部をダウンロードしているようです。アプリをコンパイルした後、互換性のない依存関係に関する警告がたくさん表示されます。

{PLAY_HOME}\framework\project\Build.scala変数が2.10.0に設定されているために発生すると思います。

「エレガントな」解決策は、Build.scala で次の変数を設定して、Scala のローカル コピーを使用することを SBT に伝えることでした。

scalaVersion := "2.10.1-local",
autoScalaLibrary := false,
scalaHome := Some(file("/Program Files (x86)/scala/"))

それでも、play ideaコマンドを使用して IntelliJ IDEA 構成を作成した場合、結果として得られるプロジェクトには、特にいくつかのクリーンアップが必要です。

  • Scala ファセットが不足しているScala 2.10.0ライブラリを参照しています。
  • Scala 2.9.2モジュール test3-build が不足しているライブラリに依存しています

Play と Scala を学んでいる他の人たちにも私の実験をしてもらいたいと思っています。

詳細はこちら: http://www.scala-sbt.org/release/docs/Howto/scala.html

于 2013-03-28T05:43:13.963 に答える