10
votes

Comment définir des dépendances par défaut pour tous les sous-projets dans SBT?

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"
  }
}


0 commentaires

3 Réponses :


15
votes

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"
    }       

}


0 commentaires

1
votes

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)


0 commentaires

1
votes

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 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: xxx pré>

avec les résolveurs code> , les sous-projets l'auront aussi défini. p> xxx pré>

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/)


5 commentaires

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 . 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 Fichiers, ils contiennent Val BlablaSetting = SEQ () . Vous les importaez et les utilisez simplement. SBT construit sont "Scala Projets " 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.