Scala 次要版本更新能否用于次要更新可传递依赖项?
假设我创建了一个二进制兼容的库Scala 次要版本更新能否用于次要更新可传递依赖项?,scala,maven,sbt,backwards-compatibility,Scala,Maven,Sbt,Backwards Compatibility,假设我创建了一个二进制兼容的库foo更新,从版本1.0.0到1.0.1。库foo通过Maven发布 我是否可以使用此次要版本更新同时升级foo依赖项的次要版本?例如,1.0.0版使用了scalaVersion:=“2.10.1”。我可以在foo1.0.1中将其更改为scalaVersion:=“2.10.3”,还是会引起麻烦 假设我在另一个项目中使用foo作为 "mygroup" %% "foo" % "1.0.+" 有几个考虑因素,但通常是的,如果依赖项是二进制兼容的,您可以更改它们的版本。
foo
更新,从版本1.0.0
到1.0.1
。库foo
通过Maven发布
我是否可以使用此次要版本更新同时升级foo
依赖项的次要版本?例如,1.0.0版使用了scalaVersion:=“2.10.1”
。我可以在foo1.0.1中将其更改为scalaVersion:=“2.10.3”
,还是会引起麻烦
假设我在另一个项目中使用foo
作为
"mygroup" %% "foo" % "1.0.+"
有几个考虑因素,但通常是的,如果依赖项是二进制兼容的,您可以更改它们的版本。Scala团队的目标是使2.10.x版本与二进制兼容。您可以根据Scala 2.10.1进行编译,并在运行时使用2.10.3 只要使用Scala库和Scala库中的方法和类型,通常可以对Scala库执行相反的操作。不过,大多数图书馆并不关心这个方向。关于二进制兼容性的其他注意事项:
- 不同的库对版本碰撞的含义有不同的策略
- 库可以自动检查二进制兼容性,也可以不自动检查二进制兼容性
- 像(Scala使用的)自动化并不能捕获所有类型的不兼容。例如,MiMa只捕获“语法”不兼容(在运行时抛出
s的不兼容)LinkageError
- 二进制兼容性并不意味着源代码兼容
但是,通常不建议使用“1.0.+”之类的动态修订。它们使得复制构建变得更加困难,同时也影响了解析速度。通常现代软件会紧随其后 给定版本号MAJOR.MINOR.PATCH,增加:
MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.
因此“2.10.3”
将与任何“2.10.x”
版本兼容
通常我们不应该关心
.PATCH
部分,除非影响我们代码的bug已经修复。我想情况就是这样。您应该在父pom.xml中管理版本号。这样,更新版本将填充到所有子模块。这就是你想要的吗?你怎么知道Scala 2.10.3不会破坏你的代码?或者一个依赖于您的代码的项目?@chris.tian没有父pom。scala库独立于我的库。@按惯例,次要版本是二进制兼容的bug fix-only版本。我很惊讶您建议不要使用+
版本。我开始很喜欢他们了。它允许我发布bug修复版本,任何新项目都可以自动利用它们。与我的问题有点相关:如果我的项目的两个依赖项A和B在两个不同的次要版本中依赖于C,例如1.0.0
和1.0.1
,我想我最终会在lib\u managed
中同时拥有1.0.0
,或者sbt会自动退回到1.0.1
?这就是我使用1.0.+
的动机。在lib_managed上,请参阅。Ivy将把两个不同的版本解析为一个。常春藤的默认策略是使用最新的版本,因此1.0.1将被选择超过1.0.0。在动态修订中,它们使再现性更加困难。您可以这样做,但它需要更多的工作,最终您真的不再使用动态修订。请注意,Gradle或Maven也不推荐它们。