题
试图了解如何设置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"
}
然后,基于 这 我尝试了以下内容。它奏效了,但这不是我期望要做的。难道不是为所有子标记设置默认依赖项是否更简单?
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,但只是说明了我的观点。
解决方案
使用继承和混合物:
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"
}
}
其他提示
正常的解决方案是将每个子项目的依赖项放在类中,就像您对Proj级一样。通常,您每个项目都需要一个类,因为它们通常具有独特的依赖性。
如果您很懒惰,则可以在线声明与依赖关系的班级:
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
模块。
依赖项对象使重新使用模块中的依赖项变得容易。
从那以后发生了很多变化,现在有了SBT 0.13.x “为我所有的子项目设置默认依赖项” 使用 project/RootBuild.scala
在根项目中 aggregate
s其他子标记(然后它们然后将设置分辨率委派给)如下:
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构建定义.
但是,还有另一种(更好的?)方法可以定义使用的常见配置 这个建筑 范围。
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/)
不隶属于 StackOverflow