使用sbt / ivy将依赖版本固定到文件夹

时间:2016-06-30 14:20:21

标签: scala sbt ivy

我们的项目由多个子项目组成,我们在本地Nexus上发布。现在,在处理库时,我们希望使用此库并构建应用程序,而无需始终将此库上载到Nexus。

对于一个典型的例子,考虑我们有两个项目A和B,其中B取决于A:

A / build.sbt:

version := 0.1.7
organization := "org.example"
name := "libraryA"
scalaVersion := "2.11.8"
libraryDependencies += "some.external" % "dependency" % "0.1"

B / build.sbt:

version := 0.2.3
organization := "org.example"
name := "applicationB"
scalaVersion := "2.11.8"
libraryDependencies += "some.other.external" % "dependency" % "0.2"
libraryDependencies += "org.example" % "libraryA" % "0.1.7"

现在让我们说我想在libraryA上工作并希望通过运行applicationB来测试我的更改。所以我分别检查A和B到一些本地文件夹。我们目前的方法如下:

  • 增加A/build.sbt中的版本号和B/build.sbt中的依赖项。然后做

    (cd A && sbt publishLocal) && (cd B && sbt compile)
    

    使用-SNAPSHOT版本时可能不需要版本增量(但我对此不确定);在任何情况下,我们总是需要进行publishLocal调用。

  • 添加一个包含项目A和B的新build.sbt

    lazy val A = (project in file("A")).settings(
      version := 0.1.7-SNAPSHOT,
      organization := "org.example",
      name := "libraryA",
      scalaVersion := "2.11.8",
      libraryDependencies += "some.external" % "dependency" % "0.1"
    )
    
    lazy val B = (project in file("B")).settings(
      version := "0.2.3",
      organization := "org.example"
      name := "applicationB"
      scalaVersion := "2.11.8"
      libraryDependencies += "some.other.external" % "dependency" % "0.2"
    ).dependsOn(A)
    

    这样做的缺点是,对于我们目前要破解的每个应用程序/库的组合,我们必须创建一个新的build.sbt文件,并且这与其他build.sbt文件有很多重复。

    但它的优点是,使用修改后的库编译应用程序,我们现在只需编写sbt B/compile

我们理想的是,特定库版本发送到特定文件夹的某种方式。这应该将传递图中的依赖项修复为特定版本,并且应该可以将其作为编译的文件夹。该过程应如下所示:

  • 查看A和B
  • 在文件夹B中,执行sbt pin "org.example%libraryA%0.1.7" folder/A
  • 然后,每当我们想要使用当前库版本编译应用程序B时,只需执行sbt compile

sbt中是否有类似的内容?我的同事告诉我,ocaml有这样的东西(在那里叫opam pin)。

1 个答案:

答案 0 :(得分:1)

首先,您可以在Ivy dynamic version format中为依赖项提供版本。例如,“1.2。+”或“latest.integration”。

要坚持特定版本的依赖关系,您可以使用sbt-lock plugin。此插件允许您“锁定”不在 build.sbt 文件中的动态版本,而是在其他 lock.sbt 文件中。最好将此文件置于版本控制之下。使用插件的命令'unlock'和'relock',您可以稍后更改锁定版本。