我们的项目由多个子项目组成,我们在本地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',你可以在以后更改锁定的版本。