我们的项目由多个子项目组成,我们在本地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
。
我们理想的是,将特定库版本发送到特定文件夹的某种方式。这应该将传递图中的依赖项修复为特定版本,并且应该可以将其作为编译的文件夹。该过程应如下所示:
sbt pin "org.example%libraryA%0.1.7" folder/A
sbt compile
。 sbt中是否有类似的内容?我的同事告诉我,ocaml有这样的东西(在那里叫opam pin
)。
答案 0 :(得分:1)
首先,您可以在Ivy dynamic version format中为依赖项提供版本。例如,“1.2。+”或“latest.integration”。
要坚持特定版本的依赖关系,您可以使用sbt-lock plugin。此插件允许您“锁定”不在 build.sbt 文件中的动态版本,而是在其他 lock.sbt 文件中。最好将此文件置于版本控制之下。使用插件的命令'unlock'和'relock',您可以稍后更改锁定版本。