我正在尝试使用SBT的配置将依赖关系范围扩展到同一项目中的模块。
在生产中,类路径上的jar会满足此依赖关系,但在开发期间,最好是server/config-a:run
或server/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。
我必须将configs
和dependsOn
移出Project.apply
调用才能进行编译。之后,当DevConfig*
或我致电server/config-a:run
时,show server/config-a:dependency-classpath
依赖关系未显示。
是否有办法使模块间依赖依赖于配置?
答案 0 :(得分: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)