2010-12-02 11 views
10

SBTの設定方法を理解しようとしていますsubprojects。すべての私のサブプロジェクトのデフォルトの依存関係を設定する正しい方法は何ですか?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" 
} 

次に、thisに基づいて、私は以下を試みました。それはうまくいったが、それは私がやらなければならないことではなかった。すべてのサブプロジェクトのデフォルトの依存関係を設定するのが簡単ではありませんか?

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

編集:アッカを使用するbetter wayがある指摘しなければならないが、ちょうど私のポイントを説明されました。

答えて

15

使用の継承とミックスイン:

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

Diz iz nice。私はダットが好きです! –

+2

大丈夫ですか?;) –

1

通常のソリューションを使用すると、メニュープロジェクトクラスでやったように、各サブプロジェクトのクラスに依存関係を置くことです。通常、サブプロジェクトごとに1つのクラスが必要です。サブプロジェクトごとに固有の依存関係があることが多いからです。

あなたは怠惰であれば、あなたは、インラインの依存関係を持つクラスを宣言することができます(製品xについて)上記の例では

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) 

を、xYモジュールはxBaseモジュールに依存します。

依存関係オブジェクトを使用すると、モジュール内の依存関係を簡単に再利用できます。

1

多く以降に変更された、とのsbt 0.13.xで、それはaggregateの他のサブプロジェクトは、(彼らはその後、設定を委任することをルートプロジェクトにproject/RootBuild.scalaを使用してを「すべての私のサブプロジェクトのデフォルトの依存関係を設定する」ことが可能です解像度)を次のように

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 

.scala Build DefinitionについてSBTの公式ドキュメントを参照してください。

ThisBuildスコープで共通の設定を定義する別の方法があります。

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ビルド定義で

と私はスコープに全体のビルドの設定をin ThisBuildを使用build.sbt、ビルド構成は、マルチプロジェクトのセットアップで2つの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/) 
+2

これは、集計とは関係ありませんが、プロジェクトが委譲するビルドレベルでの設定を定義しています。スケーラの通常の再利用メカニズムを使用して、各プロジェクトの設定を宣言するだけです。 –

+0

@MarkHarrahあなたは 'ThisBuild'を含める答えを変更させた有効なポイントを上げました。これはどうやって見えるの? –

+1

標準のScala再利用メカニズムを使用してください。たとえば、val内の一連の共通設定を定義し、それらを各プロジェクトに追加します。そんなことを学ぶコンセプトは少ない –