【问题标题】:How to toggle between project and library dependencies in SBT?如何在 SBT 中的项目和库依赖项之间切换?
【发布时间】:2013-02-03 01:52:38
【问题描述】:

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

 libraryDependencies ++= Seq(
 "org.specs2" %% "specs2" % "1.12.2" % "test" ,
 "junit" % "junit" % "4.7" % "test"
)

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

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

但在实践中,我通常希望在 项目模式库模式 之间进行切换,项目模式,我必须发布更改才能看到随着代码的成熟,它们在依赖项目中。

在代码库生命的早期,或者每当我想对模块进行频繁的更改时,我不希望为了查看上游更改而重新发布的麻烦。但在稳定/成熟的代码中,我想准确指定我所依赖的版本。

似乎 SBT 将这两个依赖项视为完全不同的。有没有比重写我的构建定义更直接的方式来在项目依赖和库依赖之间切换?

【问题讨论】:

标签: scala sbt


【解决方案1】:

我的 sbt 脚本有一些场景(测试、发布、生产)。我从脚本(从 bash,你可能有其他环境)开始 sbt,例如 DO=TESTS 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"
      )
    }
  )
}

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

【讨论】:

  • 虽然这个例子只显示了被环境变量改变的设置,但它也可以应用于原始问题。系统属性也是一个选项。也就是说,我更喜欢避免系统属性/环境变量,所以我通常会在这个答案中为场景使用自定义设置。对于最初的问题,在定义项目间依赖关系时设置不可用,因此虽然环境变量/属性并不优雅,但您可以做得更糟。
【解决方案2】:

确实,这两种依赖关系的处理方式截然不同,如果不这样就好了。主要障碍是 sbt 需要在加载设置之前了解所有外部项目(出于各种原因)。

目前,最简单的解决方案可能是另一个答案中描述的环境变量或系统属性。展望未来,以下内容在 sbt 中非常接近可能,但仍需要更多工作:

  1. 像往常一样声明一个依赖项

    libraryDependencies += "org.example" % "rich-util" % "0.1"
    
  2. 从命令行添加源依赖,过程中自动覆盖正常的依赖

    $ sbt
    > projects add ../RichUtil
    

Setting up sbt environment to hack on multiple libraries at once 中描述的基于约定的方法是一种特殊情况,也可以通过这种工作方式启用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 2015-11-10
    • 2015-12-13
    • 2017-08-19
    • 2017-04-08
    • 1970-01-01
    • 2018-03-20
    • 2011-08-27
    相关资源
    最近更新 更多