2014-09-22 74 views
3

我使用sbt 0.13.1創建了兩個模塊,並且我創建了project/MyBuild.scala來編譯這兩個模塊。 MyBuild.scala:sbt 0.13.1當我將sbt默認scala庫更改爲scala時找不到多個項目模塊2.11.2

import sbt._ 
import Keys._ 
object MyBuild extends Build { 
    lazy val task = project.in(file("task")) 
    lazy val root = project.in(file(".")) aggregate(task) dependsOn task 
} 

當我通過一套scalaHome改變Scala庫,以2.11.2。它會去maven下載task.jar並失敗,這很奇怪。這是一個錯誤嗎?

有GitHub的測試項目地址:test-sbt-0.13.1

回答

0

我建議你從根部移動根項目的來源到子文件夾(TASK2),並將其添加爲聚集。它會刪除彙總,並根據同一個項目:

object MyBuild extends Build { 
      lazy val task = project.in(file("task")) 
      lazy val task2 = project.in(file("task2")) dependsOn task 
      lazy val root = project.in(file(".")) aggregate(task, task2) 
} 

這對我的作品,但它的奇怪的是,這種不規範的項目結構工作正常使用默認scalaHome。似乎是sbt解決這種依賴和外部的問題。

P.S.這個答案並沒有涵蓋整個故事。請參閱@ jjst的答案來澄清更多。

+0

是的,它可以工作,但它仍然困惑。 – chengpohi 2014-09-22 14:24:01

+0

這可能是有效的,但我不認爲有一個根項目取決於一個根項目有任何錯誤或不規範。舉例來說,[sbt文檔用於處理宏觀項目]推薦的方法(http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Macro-Projects.html)。看到我的答案下面的解決方案,保持相同的項目結構。 – jjst 2015-03-20 10:20:08

4

這是因爲您在主build.sbt中定義了自定義scalaVersion,這意味着它僅爲根項目定義。任務項目將使用默認值:

[email protected]:test-sbt-0.13.1$ sbt                             
[...] 
> projects 
[info] In file:/home/users/jjost/dev/test-sbt-0.13.1/ 
[info] * root 
[info]  task 
> show scalaVersion 
[info] task/*:scalaVersion 
[info] 2.10.4 
[info] root/*:scalaVersion 
[info] 2.11.2-local 

因此,通過任務子項目生成的構件將不能用於根項目使用。

您可以通過確保您的項目使用相同的scalaVersion來解決此問題。最簡單的方法來做到這一點,同時保持相同的項目結構將共享像跨項目中階版本,像這樣常見的設置:

object MyBuild extends Build { 
    val commonSettings = Seq(
     scalaVersion := "2.11.2-local", 
     scalaHome := Some(file("/usr/local/scala-2.11.2/")) 
    ) 

    lazy val task = (project.in(file("task"))). 
    settings(commonSettings: _*) 

    lazy val root = (project.in(file("."))). 
    settings(commonSettings: _*). 
    aggregate(task). 
    dependsOn(task) 
} 

在實踐中,你可能要放在一個專門的項目之間共享的公共設置文件在project/common.scala之下,正如Effective sbt中的建議。