将依赖版本绑定到带有sbt/ivy的文件夹



我们的项目由多个子项目组成,我们在本地Nexus中发布。现在,当我们在一个库上工作时,我们希望使用这个库来构建应用程序,而不必一直将这个库上传到Nexus。

对于一个典型的例子,考虑我们有两个项目a和B,其中B依赖于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文件,并且这与其他构建有很多重复。sbt文件。

    但是它有一个优点,那就是要用修改后的库来编译应用程序,我们现在只需要编写sbt B/compile

理想情况下,我们想要的是将固定在特定的库版本到特定的文件夹中。这应该会将传递图中的依赖项修复到特定版本,并且这应该是一个可能被编译的文件夹。该过程应该如下所示:
  • 查看A和B
  • 文件夹B,执行sbt pin "org.example%libraryA%0.1.7" folder/A
  • 然后,每次我们想用当前库版本编译应用程序B时,只需执行sbt compile

有没有类似的东西在这里?我的同事告诉我ocaml有这样的东西(它在那里被称为opam pin)

首先,您可以以Ivy动态版本格式向依赖项提供版本。例如,"1.2。+"或"latest.integration".

你可以使用sbt-lock插件来锁定依赖项的特定版本。这个插件允许你"锁定"不在构建中的动态版本。Sbt 文件,但在附加的锁中。sbt 文件。将此文件置于版本控制之下是个好主意。使用插件的命令'unlock'和'relock',你可以在以后更改锁定的版本。

最新更新