如何在SBT中切换项目和库依赖项?

Ben*_*son 5 scala sbt

在SBT中声明托管库依赖项很容易,例如

 libraryDependencies ++= Seq(
 "org.specs2" %% "specs2" % "1.12.2" % "test" ,
 "junit" % "junit" % "4.7" % "test"
)
Run Code Online (Sandbox Code Playgroud)

虽然在SBT中声明项目依赖关系并不容易,但我也可以这样做:

object RichMath extends Build {
  lazy val myApp = Project("RichMath", file(".")) dependsOn(richUtil)   
  lazy val richUtil = RootProject(file("../RichUtil"))
}
Run Code Online (Sandbox Code Playgroud)

但实际上,我通常希望在上游项目中立即可见变更的项目模式库模式之间进行更改,我必须发布更改以在相关项目中查看它们,因为代码会成熟.

在代码库的早期阶段,或者每当我想要跨模块进行频繁更改时,我不希望重新发布的麻烦只是为了看到上游的变化.但是在稳定/成熟的代码中,我想确切地说明我依赖的版本.

似乎SBT将这两个依赖关系视为完全不同.是否有更直接的方式在项目和库依赖项之间切换而不是重写我的构建定义?

Ezh*_*hik 3

我的 sbt 脚本有一些场景(测试、发布、生产)。DO=TESTS sbt例如,我从脚本(从 bash,你可能有其他环境)启动 sbt 。这是我对环境变量的动态依赖关系:

if (sys.env.contains("LOCAL_BUILD")) {
  Seq[Project.Setting[_]](
    unmanagedResourceDirectories in Compile <+= baseDirectory { _ / "src" / "main" / "scala" },
    libraryDependencies ++= {
      Seq(
        "org.digimead" %% "digi-lib-slf4j" % "0.2.1-SNAPSHOT" % "test",
        "org.digimead" %% "digi-lib-test" % "0.2.1-SNAPSHOT" % "test",
        "org.scalatest" %% "scalatest" % "1.9" % "test"
      )
    }
  )
} else {
  Seq[Project.Setting[_]](
   libraryDependencies ++= {
      Seq(
        "org.slf4j" % "slf4j-log4j12" % "1.7.1"
      )
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我可能有不同的项目设置,其中单个 .sbt 定义由一个环境变量控制。环境变量影响所有项目/子项目群。