You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SBT中如何配置依赖版本规则为1.0.0-M10及以上

解决SBT中Scanamo依赖兼容1.0.0-M10及以上版本的问题

我之前做库的时候也碰到过类似的问题,SBT的1.0.+版本通配符确实没法匹配带预发布标签的版本(比如1.0.0-M101.0.0-RC1这类),因为它默认只识别同一主版本下的正式GA版本。要实现兼容1.0.0-M10及以上所有版本的需求,得用SBT支持的标准版本范围语法才行。

正确的版本范围配置

根据你是否打算兼容2.x系列版本,有两种写法可选:

仅兼容1.x系列(推荐)

如果你希望限定在1.x版本范围内(不包含2.0.0及以上),可以用这个范围:

libraryDependencies += "org.scanamo" %% "scanamo" % "[1.0.0-M10,2.0.0["
  • [1.0.0-M10, 表示包含1.0.0-M10这个起始版本
  • 2.0.0[ 表示不包含2.0.0这个结束版本
    这个范围完美覆盖你需要的1.0.0-M101.0.0-M111.0.0-RC11.0.1等所有1.x版本。

兼容所有1.0.0-M10及以上版本

如果未来你也想兼容2.x系列,那就用无上限的范围:

libraryDependencies += "org.scanamo" %% "scanamo" % "[1.0.0-M10,)"

这个写法表示“大于等于1.0.0-M10的所有版本”,没有版本上限。

为什么1.0.+不生效?

SBT的+通配符是简化语法,等价于[1.0.0,1.1.0[,而且有个关键限制:只会匹配不带预发布标签的正式版本。像1.0.0-M10这种带-M-RC后缀的预发布版本会被直接忽略,这就是你找不到对应版本的核心原因。

实践建议

在你的库的build.sbt里用上面的版本范围声明依赖后,用户就能在自己的项目里自由指定符合要求的Scanamo版本了。比如用户可以写:

// 选择预发布版本
libraryDependencies += "org.scanamo" %% "scanamo" % "1.0.0-RC1"
// 或者选择正式版
libraryDependencies += "org.scanamo" %% "scanamo" % "1.0.1"

SBT会自动解析用户指定的版本,只要它在你声明的范围内,就不会出现依赖冲突。

另外,如果你需要在自己的库的测试阶段固定使用某个版本(保证测试稳定性),可以单独给测试依赖指定版本:

// 编译时依赖,允许用户提供符合范围的版本
libraryDependencies += "org.scanamo" %% "scanamo" % "[1.0.0-M10,2.0.0["
// 测试时固定使用1.0.1版本
libraryDependencies += "org.scanamo" %% "scanamo" % "1.0.1" % Test

内容的提问来源于stack exchange,提问作者zella

火山引擎 最新活动