SBT中如何配置依赖版本规则为1.0.0-M10及以上
解决SBT中Scanamo依赖兼容1.0.0-M10及以上版本的问题
我之前做库的时候也碰到过类似的问题,SBT的1.0.+版本通配符确实没法匹配带预发布标签的版本(比如1.0.0-M10、1.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-M10、1.0.0-M11、1.0.0-RC1、1.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




