Come impostare le dipendenze di default per tutti i sottoprogetti in SBT?
Domanda
Cercando di capire come impostare SBT sottoprogetti . Qual è il modo corretto di impostare le dipendenze di default per tutti i miei progetti secondari?
ho provato questo, ma i miei progetti secondari non sono stati in ripresa una qualsiasi delle dipendenze (che hanno scaricato fine).
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"
}
Poi, sulla base di questo ho provato quanto segue. Ha funzionato, ma non è quello che mi aspettavo di avere a che fare. Non c'è un più semplice era quello di impostare le dipendenze di default per tutti i sottoprogetti?
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"
}
}
Modifica: Dovrebbe sottolineare c'è un modo meglio da usare Akka, ma è stato solo illustrante il mio punto.
Soluzione
Usa eredità e mixins:
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"
}
}
Altri suggerimenti
La soluzione normale è quello di mettere le dipendenze in una classe per ogni progetto sub, proprio come avete fatto con il Proj classe. Di solito è necessario una classe per progetto sub, dal momento che spesso hanno dipendenze uniche.
Se siete pigri, è possibile dichiarare la classe con le dipendenze in linea:
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)
Nell'esempio precedente (per il prodotto x), il modulo xY
dipende dal modulo xBase
.
L'oggetto dipendenze rende facile riutilizzare le dipendenze nei moduli.
Molto è cambiato da allora, e con 0.13.x SBT è ora possibile "per impostare le dipendenze di default per tutti i miei progetti secondari" usando project/RootBuild.scala
nel progetto principale che aggregate
s gli altri sottoprogetti (che poi delegare impostazione di risoluzione a) come segue:
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/")
}
Con il set resolvers
, i sottoprogetti avranno esso impostato, anche.
[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
per il progetto principale è la seguente:
lazy val root = project in file(".") aggregate (a, b)
lazy val a = project dependsOn b
lazy val b = project
, consultare la documentazione ufficiale della SBT sulla .scala Corporatura definizione .
C'è tuttavia un altro modo (migliore?) Per definire una configurazione comune con la ThisBuild portata.
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/"
Con la definizione RootBuild.scala
accumulo sopra e build.sbt
dove ho usato in ThisBuild
alla portata l'impostazione per l'intera costruzione, la configurazione di generazione si è conclusa con due resolvers
essendo di default nella configurazione multi-progetto.
[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/)