2010-12-02 85 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/) 
相关问题