我们的软件使用非标准版本号系统,这会导致
sbt
找到错误版本。
名为 feature/x-y-z
的分支中的Jars 将使用版本
x-y-SNAPSHOT
发布到 Maven 存储库。这些可能由 mvn
或 sbt
发布。
发布的 jar 包含数据定义 jar 的版本,因为针对不同版本的基本数据类编译的代码经常以令人困惑的方式失败,因此发布的 jar 通常会有一个类似
1.2.3-1
的版本,其中这是使用的第一个版本1.2.3
数据类。
我的 sbt 有(部分)
val LibVersion = "x-y-SNAPSHOT"
lazy val root = project.in(file(".")).settings(
libraryDependences ++= Seq(
"com.example" % "some-lib" % LibVersion,
"com.example" %% "some-scala-lib" % "4.3.0"
)
如果我运行
show externalDependencyClasspath
,它会列出 some-lib-x-y-<datetime info>.jar
(这是正确的)。如果我运行 dependencyTree
,它会列出类似 some-lib-1.2.3-6
的内容(这是错误的)。
代码最终使用错误的 (
sbt stage
) 版本的 1.2.3-6
构建到 Docker 映像中(我认为是通过 some-lib
和其他一些工具)。
我还添加了一个
dependencyOverrides ++= Seq(
"com.example" % "some-lib" % LibVersion) // with or without force() here
没有明显效果。
有什么方法可以让
sbt
使用我告诉它使用的版本吗?
我正在运行
sbt 1.9.1
以及来自 project/plugins.sbt
的这些插件:
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.16")
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.5")
问题似乎出在 Maven 发布库的方式上。 pom 部分是,
<project>
<groupId>com.example</groupId>
<artifactId>some-lib</artifactId>
<packaging>jar</packaging>
<version>${revision}</version>
<properties>
<revision>1.2.3-6</revision>
</properties>
<!-- Other build stuff -->
</project>
该罐子已发布
mvn deploy -Drevision=x-y-SNAPSHOT <other args>
。
在这种情况下发布的
*.pom
文件包含错误的版本号:1.2.3-6
而不是 x-y-SNAPSHOT
。我被告知这是 Maven 中的一个已知错误,尽管我没有相关参考。
sbt
然后信任已发布的 pom 并认为它的版本错误。
解决方法是让库的 CI 作业编辑 pom 并将正确的版本放入
<revision>
行,而不是将其作为变量值传递。