2013-02-07 102 views
2

我有一個使用兩個版本的Scala的多項目。該Build.scala看起來是這樣的:sbt在多項目構建中使用不同的Scala版本

import sbt._ 
import Keys._ 

object Build extends sbt.Build { 
    lazy val root: Project = Project(
    id = "scalacolliderugens", 
    base = file("."), 
    aggregate = Seq(gen, core) 
) 

    lazy val gen = Project(...) 
    lazy val core = Project(...) 

    val ugenGenerator = TaskKey[Seq[File]]("ugen-generate", "Generate UGen class files") 

    def runUGenGenerator(source: File, cp: Seq[File]): Seq[File] = Nil // TODO 
} 

在那裏我有使用Scala的2.9.2純源發電項目:

lazy val gen = Project(
    id = "scalacolliderugens-gen", 
    base = file("gen"), 
    settings = Project.defaultSettings ++ Seq(
     scalaVersion := "2.9.2", // !!! 
     libraryDependencies ++= Seq(
     "org.scala-refactoring" % "org.scala-refactoring_2.9.1" % "0.4.1" 
    ), 
     libraryDependencies <+= scalaVersion { sv => 
     "org.scala-lang" % "scala-compiler" % sv 
     } 
    ) 
) 

並結合生成的來源,對編譯斯卡拉2.10實際的項目:

lazy val core = Project(
    id = "scalacolliderugens-core", 
    base = file("core"), 
    settings = Project.defaultSettings ++ Seq(
     scalaVersion := "2.10.0", // !!! 
     sourceGenerators in Compile <+= (ugenGenerator in Compile), 
     ugenGenerator in Compile <<= 
     (scalaSource in Compile, dependencyClasspath in Runtime in gen) map { 
      (src, cp) => runUGenGenerator(src, cp.files) 
     } 
    ) 
    ).dependsOn(gen) 

當我編譯,我得到SBT警告:

[warn] Binary version (2.9.2) for dependency org.scala-lang#scala-library;2.9.2 
[warn] in de.sciss#scalacolliderugens_2.10;1.0.1 differs from Scala binary \ 
    version in project (2.10). 
[info] Resolving org.scala-lang#scala-library;2.9.2 ... 
[info] Done updating. 
[warn] Binary version (2.9.2) for dependency org.scala-lang#scala-library;2.9.2 
[warn] in de.sciss#scalacolliderugens-gen_2.10;1.0.1 differs from Scala binary \ 
    version in project (2.10). 
[warn] Binary version (2.9.2) for dependency org.scala-lang#scala-compiler;2.9.2 
[warn] in de.sciss#scalacolliderugens-gen_2.10;1.0.1 differs from Scala binary \ 
    version in project (2.10). 

我應該擔心嗎?我在這裏做的不好嗎?

回答

0

您不能混合Scala的不同次要版本的字節碼。即,由任何2.9.x系列編譯器編譯的代碼是而不是與由2.10.x(或2.8.x)編譯器發出的代碼兼容。

+0

我知道......我的項目是斯卡拉2.10,_except_爲它運行(如SBT,順便說一句)使用Scala的2.9.2 __source代碼generator__子項目。該生成器可以在Scala 2.9和2.10中發佈合法的源代碼。 –

1

OK ......

我多項目SBT項目,他們普遍有部分由所有共享和部分具體到每一個子項目SBT設置。在我的情況下,通用設置包括要使用的Scala版本。

您可以用相同的方法構建您的構建規範,並將Scala版本設置置於子項目特定的設置中。如有必要,如果有一些設置對於所有子項目和子項目的子集以及其他特定於每個子項目的子項都是通用的,則可以進一步對設置進行分層。

+0

是的,我完全是這樣(看我的問題 - 'scalaVersion'是在子項目設置)。這就是爲什麼我不瞭解sbt警告。我的看法是,它假設了一些隱含的「ThisBuild」中的scalaVersion,並擔心這種差異,即使子項目不是二元組合。 –

2

將以下設置添加到gen項目中。

scalaBinaryVersion:= CrossVersion.binaryScalaVersion("2.9.2") 
+2

你有任何進一步的鏈接解釋這是/暗示什麼?這會阻止'-SNAPSHOT'版本入侵嗎? –

相關問題