6

crossScalaVersionsサブプロジェクトでの動作に苦労しています。

2.10 (foo) でコンパイルするプロジェクトと 2.11 (bar) でコンパイルするプロジェクトがあります。クロス コンパイルされたプロジェクトを共有します (共通)。

プロジェクト foo および bar をコンパイルするにはどうすればよいですか?


build.sbt

lazy val root = (project in file(".")).aggregate(foo, bar).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4")
)

lazy val foo = (project in file("foo")).dependsOn(common).settings(
  crossScalaVersions := Seq("2.10.4"),
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(common).settings(
  crossScalaVersions := Seq("2.11.4"),
  scalaVersion := "2.11.4"
)

lazy val common = (project in file("common")).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4")
)

project/build.properties

sbt.version=0.13.7

foo/src/main/scala/Foo.scala

object Foo {
  <xml>{new C}</xml>
}

bar/src/main/scala/Bar.scala

case class Bar(a: C, b: C, c: C, d: C, e: C, f: C, g: C,
  h: C, i: C, j: C, k: C, l: C, m: C, n: C, o: C, p: C,
  q: C, r: C, s: C, t: C, u: C, v: C, w: C, x: C, y: C,
  z: C)

共通/src/main/scala/Common.scala

class C {}

試行 1

$ sbt compile
[info] Resolving jline#jline;2.12 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: common#common_2.11;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn]  Note: Unresolved dependencies path:
[warn]      common:common_2.11:0.1-SNAPSHOT
[warn]        +- bar:bar_2.11:0.1-SNAPSHOT
sbt.ResolveException: unresolved dependency: common#common_2.11;0.1-SNAPSHOT: not found

試行 2

$ sbt +compile
[error] /home/paul/test/bar/src/main/scala/Bar.scala:1: Implementation restriction: case classes cannot have more than 22 parameters.
[error] case class Bar(a: C, b: C, c: C, d: C, e: C, f: C, g: C,
[error]            ^
[error] one error found
[error] (bar/compile:compile) Compilation failed

試行 3

$ sbt foo/compile bar/compile
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: common#common_2.11;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn]  Note: Unresolved dependencies path:
[warn]      common:common_2.11:0.1-SNAPSHOT
[warn]        +- bar:bar_2.11:0.1-SNAPSHOT
sbt.ResolveException: unresolved dependency: common#common_2.11;0.1-SNAPSHOT: not found

試行 4

$ sbt +foo/compile +bar/compile
[error] /home/paul/test3/foo/src/main/scala/Foo.scala:2: To compile XML syntax, the scala.xml package must be on the classpath.
[error] Please see http://docs.scala-lang.org/overviews/core/scala-2.11.html#scala-xml.
[error]   <xml>{new C}</xml>
[error]   ^
[error] one error found
[error] (foo/compile:compile) Compilation failed

試行 5

ベースディレクトリは同じですが、scala バージョンが異なるプロジェクトを定義common_2_10してみました。common_2_11ターゲットが Scala バージョンによって名前空間化されていることを読んだことを思い出しましたが、SBT は競合があると言っています。

$ sbt
[error] Overlapping output directories:/home/paul/test3/common/target:
[error]     ProjectRef(file:/home/paul/test3/,common_2_10)
[error]     ProjectRef(file:/home/paul/test3/,common_2_11)

私が仕事を得た唯一のことは、手動でバージョンを指定することです:

$ sbt ++2.10.4 foo/compile ++2.11.4 bar/compile

しかし、これは多くのコマンドであり、並列処理を使用することはできず、(1) プロジェクトの集約と (2) クロス ビルドの全体的な使用を不要にします。

の意図について基本的な何かが欠けていcrossScalaVersionsますか? それとも、SBT の残りの部分とうまく連携させ、異種プロジェクトをコンパイルする方法はありますか?

4

2 に答える 2

6

私はコモンを 2 回、バージョンごとに 1 回宣言することになりました。

lazy val root = (project in file(".")).aggregate(foo, bar)

lazy val foo = (project in file("foo")).dependsOn(common_2_10).settings(
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(common_2_11).settings(
  scalaVersion := "2.11.4"
)

def commonProject = (project in file("common")).settings(
  target := baseDirectory.value / s"target-${scalaVersion.value}"
)

lazy val common_2_10 = commonProject.settings(
  scalaVersion := "2.10.4"
)

lazy val common_2_11 = commonProject.settings(
  scalaVersion := "2.11.4"
)

ターゲット ディレクトリを異なるものにする必要があったことに注意してください。

また、プロジェクト定義の SBT の魔法の (反射ベースの) 検索が含まれていないことにも注意してdefください。commonProject


これは最も美しいというわけではありませんが、堅牢で、読みやすく、合理的です。すべてのコマンド/タスクは期待どおりに機能します。

ある意味では、これはよりも優れています.2.10 と 2.11 のプロジェクトを並行してcrossScalaVersionsコンパイルできるようになりました.これは:)では起こりません.crossScalaVersions


編集: これを支援するために、SBT プラグインsbt-crossを作成しました。

于 2015-02-15T00:31:25.933 に答える