2014-02-11 17 views
0

我正在嘗試使用SBT的配置將相關性範圍限定在同一個項目中的模塊。模塊間依賴關係取決於SBT中可能的配置?

在生產中,此類依賴關係由類路徑上的jar滿足,但在dev中,執行server/config-a:runserver/config-b:run以手動選擇依賴關係會很好。

目前,我有這樣的事情:

lazy val configA = config("config-a") extend Runtime 
lazy val configB = config("config-b") extend Runtime 

lazy val DevConfigA = Project(id = "dev-config-a", base = file("dev-config-a")) 
lazy val DevConfigB = Project(id = "dev-config-b", base = file("dev-config-b")) 

lazy val server = Project(id = "server", 
          base = file("server"), 
          dependencies = Seq(common)) 
         .configs(configA, configB) 
         .dependsOn(DevConfigA % configA, DevConfigB % configB) 

DevConfigA和DevConfigB帶來用於配置資源。我們希望其中的一個被加載。目標是server/config-a:run將取決於DevConfigA模塊,而不取決於DevConfigB。

我不得不將configsdependsOn從呼叫移到Project.apply才能編譯它。之後,DevConfig*依賴關係不會顯示出來,當我server/config-a:run或如果我打電話show server/config-a:dependency-classpath

有沒有辦法使模塊間的依賴依賴於配置?

回答

0

是的,有一種方法可以使依賴配置依賴 - 使用libraryDependencies config-scoped。

我正在使用SBT的最新穩定版本。

[server]> show sbtVersion 
[info] 0.13.1 

讓我們假設你需要不同版本的庫,例如: scalaz,根據你執行run的配置。事實上,你不必擔心任務,但是給定配置中可用的依賴關係,並且自從libraryDependencies驅動它之後,我將使用它。

[server]> help libraryDependencies 
Declares managed dependencies. 

這裏是build.sbt,給你想要的。

build.sbt

lazy val configA = config("config-a") extend Runtime 

lazy val configB = config("config-b") extend Runtime 

lazy val server = project in file(".") configs(configA, configB) 

val scalaz705 = "org.scalaz" %% "scalaz-core" % "7.0.5" 
val scalaz710_M5 = "org.scalaz" %% "scalaz-core" % "7.1.0-M5" 

libraryDependencies in configA += scalaz705 

libraryDependencies in configB += scalaz710_M5 

通過上述build.sbt SBT讓我們挑根據配置的不同版本Scalaz的。

[server]> show libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.3) 
[server]> show config-a:libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.3, org.scalaz:scalaz-core:7.0.5) 
[server]> show config-b:libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.3, org.scalaz:scalaz-core:7.1.0-M5) 
+0

無論如何做到這一點與模塊依賴關係,而不是librarydependences?在我的例子中,DevConfigA和DevConfigB是其他子模塊。 – EvilRyry

+0

您能否在您的問題中添加子模塊的定義?當你使用'DevConfigA%configA'時,它意味着'compile-> configA',這意味着來自'DevConfigA'的編譯範圍庫最終成爲'configA'範圍的庫。這是你在追求什麼? –