首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为SBT中的所有子项目设置默认依赖关系?

如何为SBT中的所有子项目设置默认依赖关系?
EN

Stack Overflow用户
提问于 2010-12-02 19:39:15
回答 3查看 3.2K关注 0票数 10

尝试了解如何设置SBT subprojects。为我的所有子项目设置默认依赖关系的正确方法是什么?

我试过了,但是我的子项目没有提取任何依赖项(它们下载得很好)。

代码语言:javascript
复制
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,我尝试了以下方法。它起作用了,但这不是我想要做的。难道没有更简单的was来设置所有子项目的默认依赖关系吗?

代码语言:javascript
复制
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"
  }
}

编辑:应该指出有一个使用Akka的better way,但只是说明了我的观点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-02 20:49:59

使用继承和混合:

代码语言:javascript
复制
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"
    }       

}
票数 15
EN

Stack Overflow用户

发布于 2010-12-02 21:07:20

通常的解决方案是将每个子项目的依赖项放在一个类中,就像您对Proj-class所做的那样。通常每个子项目需要一个类,因为它们通常具有唯一的依赖关系。

如果你很懒,你可以用内联依赖声明类:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-01-06 22:18:16

自那以后发生了很大的变化,在SBT0.13.x中,现在可以在aggregate的其他子项目(然后将设置分辨率委托给该项目)的根项目中使用project/RootBuild.scala设置所有子项目的默认依赖项,如下所示:

代码语言:javascript
复制
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之后,子项目也会设置它。

代码语言:javascript
复制
[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如下:

代码语言:javascript
复制
lazy val root = project in file(".") aggregate (a, b)

lazy val a = project dependsOn b

lazy val b = project

有关.scala Build Definition,请参考sbt的官方文档。

然而,还有另一个(更好的?)使用ThisBuild作用域定义通用配置的方法。

代码语言:javascript
复制
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作为默认值。

代码语言:javascript
复制
[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/)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4334534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档