2015-02-09 57 views
4

我正在努力與crossScalaVersions如何處理子項目。SBT斯卡拉跨版本,與聚合和依賴關係

我有一個用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") 
) 

項目/ build.properties

sbt.version=0.13.7 

富/ src目錄/主/斯卡拉/ Foo.scala

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

酒吧/ SRC /主/階/ 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 /主/階/ 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

我甚至試圖定義common_2_10common_2_11項目與相同的基本目錄,但不同的scala版本。我記得閱讀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

我結束了每個版本宣佈共同兩次,一次。

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不包括SBT對項目定義的神奇(基於反射)搜索。


這是不是最漂亮的,但它是強大的,可讀的,合理的。所有的命令/任務都可以按照人們的預期工作

在某種程度上,這是甚至比更好crossScalaVersions,在2.10和2.11的項目,現在可以在平行編譯,不與crossScalaVersions :)


編輯發生:我創建一個SBT插件,sbt-cross,幫助解決這個問題。

+0

優秀的插件!比'sbt-doge'還要多!至少在這種情況下。 – Atais 2017-07-14 19:29:03

3

看看我sbt-doge

SBT插件跨子項目總任務及其crossScalaVersions

+0

嗯。尼斯。 '$ sbt'非常編譯'。謝謝! – 2015-02-09 06:29:50