2013-02-07 105 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'版本入侵吗? –

相关问题