3

我有一个使用两个版本的 Scala 的多项目。Build.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
      }
    )
  )

以及包含生成的源代码的实际项目,针对 Scala 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).

我应该担心吗?我在这里做坏事吗?

4

3 回答 3

2

将以下设置添加到 gen 项目。

scalaBinaryVersion:= CrossVersion.binaryScalaVersion("2.9.2")
于 2013-05-03T09:47:30.877 回答
1

好的...

我有多项目 SBT 项目,它们通常具有 SBT 设置,部分由所有人共享,部分特定于每个子项目。就我而言,常用设置包括要使用的 Scala 版本。

您可以以相同的方式构建您的构建规范,并将 Scala 版本设置放在子项目特定的设置中。如有必要,如果有一些设置对所有人通用,一些设置对子项目的子集通用,而其他设置特定于每个单独的子项目,则可以进一步对设置进行分层。

于 2013-02-07T16:03:24.310 回答
0

您不能混合来自不同次要版本的 Scala 的字节码。即,任何 2.9.x 系列编译器编译的代码与 2.10.x(或 2.8.x)编译器发出的代码兼容。

于 2013-02-07T14:56:34.607 回答