2014-02-11 15 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'范围的库。这是你在追求什么? –