essayer de comprendre comment configurer sbt sous-projets . Quelle est la bonne façon de définir des dépendances par défaut pour tous mes sous-projets?
J'ai essayé cela, mais mes sous-projets ne prenaient aucune des dépendances (elles ont été téléchargées bien). P>
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" } }
3 Réponses :
Utiliser l'héritage et les mélanges:
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" } }
La solution normale consiste à mettre les dépendances dans une classe pour chaque sous-projet, tout comme vous l'avez fait avec la classe Proj. Habituellement, vous avez besoin d'une classe par sous-projet, car ils ont souvent des dépendances uniques.
Si vous êtes paresseux, vous pouvez déclarer la classe avec les dépendances en ligne: p>
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)
Beaucoup a changé depuis, et avec SBT 0.13.x, il est maintenant possible "pour définir des dépendances par défaut pour tous mes sous-projets" em> en utilisant avec les résolveurs code> , les sous-projets l'auront aussi défini. p> projet / rootbuild.scala code> Le projet racine que
agrégat code> S est les autres sous-projets (qu'ils déléguent ensuite la résolution de la définition de) comme suit:
build.sbt code> pour le projet racine est comme suit: P>
[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/)
Cela n'a rien à voir avec l'agrégation, mais avec définir des paramètres au niveau de construction, que les projets déléguent ensuite. Il est généralement préférable de simplement déclarer les paramètres de chaque projet à l'aide de mécanismes normaux de réutilisation Scala.
@MarkHarrah Vous venez de soulever un point valide qui m'a fait changer la réponse pour inclure ivisbuild code>. Comment ça regarde maintenant?
Utilisez simplement des mécanismes standard de réutilisation Scala. Par exemple, définissez une séquence de paramètres communs dans un Val et ajoutez-les à chaque projet. Moins de concepts pour apprendre de cette façon.
J'ai besoin d'un gist simple pour être sûr que j'ai compris l'idée. J'apprécierais des conseils supplémentaires. Serait-ce un mélange de .scala dans le projet root et .sbt defs dans des sous-projets?
Tout simplement plus ___. SCALA CODE> Fichiers, ils contiennent
Val BlablaSetting = SEQ () Code>. Vous les importaez et les utilisez simplement. SBT construit i> sont "Scala Projets i>" de sorte que toute technique de la réutilisation de code s'applique à la construction de la même manière qu'au code normal.