2010-12-02 86 views
10

試圖瞭解如何設置SBT subprojects。什麼是爲我的所有子項目設置默認依賴關係的正確方法?如何在SBT中爲所有子項目設置默認依賴關係?

我試過這個,但我的子項目沒有拿起任何依賴項(他們下載的很好)。

import sbt._ 

class MyProjects(info: ProjectInfo) extends DefaultProject(info) 
{ 
    val projA = project("projA", "ProjectA") 
    val projB = project("projB", "ProjectB") 

    val akkaRepo = "Akka maven2 repo" at "http://www.scalablesolutions.se/akka/repository/" 
    val multiverseRepo = "Multiverse maven2 repo" at "http://multiverse.googlecode.com/svn/maven-repository/releases/" 
    val guiceyFruitRepo = "GuiceyFruit Maven2 repo" at "http://guiceyfruit.googlecode.com/svn/repo/releases/" 
    val jBossRepo = "JBoss maven2 repo" at "https://repository.jboss.org/nexus/content/groups/public/" 

    val junit = "junit" % "junit" % "4.5" % "test" 
    val scalatest = "org.scalatest" % "scalatest" % "1.2" % "test" 
    val akka = "se.scalablesolutions.akka" % "akka-core_2.8.0" % "0.10" 
} 

然後,根據this我試了下面。它有效,但這不是我所期望的。是不是更簡單的是爲所有子項目設置默認依賴關係?

import sbt._ 

class MyProjects(info: ProjectInfo) extends DefaultProject(info) 
{ 
    val projA = project("projA", "ProjectA", new Proj(_)) 
    val projB = project("projB", "ProjectB", new Proj(_)) 

    val akkaRepo = "Akka maven2 repo" at "http://www.scalablesolutions.se/akka/repository/" 
    val multiversRepo = "Multiverse maven2 repo" at "http://multiverse.googlecode.com/svn/maven-repository/releases/" 
    val guiceyFruitRepo = "GuiceyFruit Maven2 repo" at "http://guiceyfruit.googlecode.com/svn/repo/releases/" 
    val jBossRepo = "JBoss maven2 repo" at "https://repository.jboss.org/nexus/content/groups/public/" 

    class Proj(info:ProjectInfo) extends DefaultProject(info){ 
    val junit = "junit" % "junit" % "4.5" % "test" 
    val scalatest = "org.scalatest" % "scalatest" % "1.2" % "test" 
    val akka = "se.scalablesolutions.akka" % "akka-core_2.8.0" % "0.10" 
    } 
} 

編輯:需要指出的還有一個better way使用阿卡,但只是說明我的觀點。

回答

15

使用繼承和混入:

import sbt._ 

class ModularProject(info: ProjectInfo) extends DefaultProject(info){ 

    lazy val childProject = project("projA", "ProjectA", 
     new DefaultProject(_) 
      with Repositories 
      with GlobalDependencies 
      with AkkaDependencies) 

    trait Repositories{ 
     lazy val akkaRepo = "Akka maven2 repo" at 
     "http://www.scalablesolutions.se/akka/repository/" 
     lazy val multiversRepo = "Multiverse maven2 repo" at 
     "http://multiverse.googlecode.com/svn/maven-repository/releases/" 
     lazy val guiceyFruitRepo = "GuiceyFruit Maven2 repo" at 
     "http://guiceyfruit.googlecode.com/svn/repo/releases/" 
     lazy val jBossRepo = "JBoss maven2 repo" at 
     "https://repository.jboss.org/nexus/content/groups/public/" 
    } 

    trait GlobalDependencies{ 
     lazy val junit = "junit" % "junit" % "4.5" % "test" 
     lazy val scalatest = "org.scalatest" % "scalatest" % "1.2" % "test" 
    } 

    trait AkkaDependencies{ 
     lazy val akka = "se.scalablesolutions.akka" % "akka-core_2.8.0" % "0.10" 
    }  

} 
+0

Diz iz很好。我喜歡dat特質! – 2010-12-02 15:12:59

+2

你還好嗎,夥計?;) – 2010-12-02 16:31:45

1

正常的解決方案是將依賴於一類爲每個子項目,就像你與該凸出級一樣。通常每個子項目需要一個類,因爲它們通常具有獨特的依賴關係。

如果懶惰,可以用在在線的依賴性聲明類:

object Dependencies { 
    .... 
    lazy val jodaTime = "joda-time" % "joda-time" % ... 
    lazy val scalaTime = "org.scala-tools" % "time" % ... 
    lazy val redis = "com.redis" % "redisclient" % ... 
} 

val xBase = project("x-base", "x-base", new DefaultProject(_) { 
    val jodaTime = Dependencies.jodaTime 
    val scalaTime = Dependencies.scalaTime 
    }) 

val xY = project("x-y", "x-y", new DefaultProject(_) { val redis = Dependencies.redis }, xBase) 

在上述(爲產品X)的例子中,xY模塊取決於xBase模塊上。

Dependencies對象可以很容易地重用模塊中的依賴關係。

1

,因爲發生了很多變化,並與SBT 0.13.x,現在有可能根項目aggregate發其他子項目(他們然後委託設置使用project/RootBuild.scala「設置爲我所有子項目默認的依賴關係」分辨率)如下:

import sbt._ 
import Keys._ 

object RootBuild extends Build { 
    override lazy val settings = super.settings ++ 
    Seq(resolvers += "Akka maven2 repo" at "http://www.scalablesolutions.se/akka/repository/") 
} 

隨着resolvers集,子項目將它設置了。

[root]> resolvers 
[info] a/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/) 
[info] b/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/) 
[info] root/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/) 

build.sbt根項目如下:

lazy val root = project in file(".") aggregate (a, b) 

lazy val a = project dependsOn b 

lazy val b = project 

諮詢SBT約.scala Build Definition的官方文檔。

還有另一種(更好的?)方法來定義與ThisBuild範圍的通用配置。

lazy val root = project in file(".") aggregate (a, b) 

lazy val a = project dependsOn b 

lazy val b = project 

resolvers in ThisBuild += "JBoss maven2 repo" at "https://repository.jboss.org/nexus/content/groups/public/" 

通過上述RootBuild.scala構建定義和build.sbt我曾經in ThisBuild到範圍爲整個構建設置,構建配置結束了兩個resolvers在多項目設置爲默認值。

[root]> resolvers 
[info] a/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/, JBoss maven2 repo: https://repository.jboss.org/nexus/content/groups/public/) 
[info] b/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/, JBoss maven2 repo: https://repository.jboss.org/nexus/content/groups/public/) 
[info] root/*:resolvers 
[info] List(Akka maven2 repo: http://www.scalablesolutions.se/akka/repository/, JBoss maven2 repo: https://repository.jboss.org/nexus/content/groups/public/) 
相關問題