Ruby生态系统中Semver的替代品

PSk*_*cik 4 ruby semantic-versioning

在红宝石生态系统(甚至其他地方)中是否有功能(即,我可以用它bundlerrubygems替代)SemVer

我对SemVer(MAJOR.MINOR.PATCH)的问题在于它试图量化两个不兼容的东西:

  1. 改变大小(PATCH - 一个小变化)
  2. 向后兼容性(MINOR - 不间断,MAJOR - 打破)

PATCH仍然很可能是一个突破性的变化,这使得它等于MAJOR而小于MINOR,而MINOR小于MAJOR.所以:

  PATCH == MAJOR  && MAJOR > MINOR && MINOR > PATCH
Run Code Online (Sandbox Code Playgroud)

这意味着PATCH <> MINOR同时,这永远不会是真的.

理想情况下,我希望有两个版本控制线 - 一个基于向后兼容性(例如没有破损,可能难以察觉的破损(==补丁),破坏)和一个基于变化大小(无视向后兼容性),一个人性化的版本行,如果你愿意的话.我希望能够同时使用它们.

(仅使用基于纯后向兼容性的版本控制,只要操作系统通过向屏幕写入"hello world"开始,我就可以从"hello world"转到操作系统.)

例如:如果H代表人类友好的版本控制,而B代表向后兼容性是基于后向兼容性的,那么我希望能够说:

  1. 〜> H2.0(==坚持使用H2.X;如果你制作了一个版本H3.0,它增加了200MB的非破坏性附加功能,我不希望你下载它,但确实给我带来了你做的那些不间断的改进H2.0线)
  2. 〜> B0.1(==给我不间断的变化(第3列,相当于Semver的第2列)并可能不知不觉地破坏 变化(第2列,相当于SemVer的第3列))

jro*_*ind 6

rubygems/bundler中没有支持两个不同的并行版本号,没有.

但是没有理由你必须使用semver.您只需要一个版本号.Bundler和rubygems适用于任何版本号'xyz',甚至'xy'或'xyzab',其中所有组件都是数字.就"功能"而言,您可以使用一个版本号执行任何操作.(如果你使用字母而不仅仅是数字,rubygems可能会认为它表示'预发布'版本.但如果你坚持使用数字,你可以做任何你想做的事情.

在semver之前,许多人只是在他们感觉到它的时候增加了组件,当它看起来像是一个重大的变化,或者一个小的变化,或一个微小的变化.您当然可以这样做 - 或使用任何其他系统来确定要应用的单个版本号 - 并且基础结构将正常工作.您的下游用户可能会也可能不会欣赏它.

我不确定你是否误解了semver.Semver说,一个突破性的变化必须是一个主要的版本增量.如果"虽然PATCH仍然很可能是一个突破性的变化",那么你就没有做过semver.根据semver的说法,一个突破性的变化必定是一个主要的版本.这并不总是遵循,无论是因为意外的错误,还是不理解semver的人,或者不愿意遵循它但想要说他们仍然关注它 - 但这就是semver所说的.

事实上,semver说版本号应该只是关于兼容性,而不是关于变化的"大小"(无论是主观的"大"还是字节大小;你似乎在谈论字节化的增量,我从来没有见过对版本的解释之前的数字).向后突破的变化需要一个主要版本的凸起; 没有向后突破的更改的新功能需要一个小版本凹凸; 否则(没有新功能,没有向后突破的变化;所以基本上是错误修正或内部重构)补丁级别的颠簸.Semver并没有试图合并两个不兼容的东西-而它试图完全抛弃他们中的一个,它抛出的想法,版本号应该代表"变化的尺寸",它仅代表兼容性.然而,人们对此的抵制是对semver的一些抵抗,是真的.

我不确定你的意思是"可能不知不觉地突破变化".Semver说,一个突破性的变化是主要的版本颠簸,你不会把它称为补丁,如果它"潜在地不知不觉地破坏",我想这意味着只有一些人会注意到它而你猜测大多数不会?Semver对此类别没有兴趣.Semver不允许您在补丁级别版本中发布重大更改,因为您认为它"潜在地不知不觉中断"(也许您会喜欢它?).

版本控制和发布管理很难.它通常是维护者的痛苦和下游用户的痛苦之间的平衡.我怀疑创建两个单独的并行版本号会改善一些事情,而不仅仅是让任何人都更加困惑.我甚至不明白你是如何实现的"我不想让你下载它,但确实给我带来了你在H2.0系列中所做的那些不间断的改进" - 听起来你想象的不只是两个每个版本上的版本号,但实际上是版本号的两个完全不同的"行"

好吧,我想你可以做到这一点,只是发布两个不同的宝石名称.Widget_H和Widget_B,我想?我猜你的回购中有两个不同的git分支?我不知道,我无法弄清楚你的思考如何可能被运用到一个系统中,甚至是假设的.看起来它会让维护者和下游用户感到非常困惑 - 但是只使用两个不同的gem名称可以在rubygems/bundler生态系统中实现你想要的东西吗?

如果您还没有阅读过semver规范,我会非常鼓励它,所以你了解semver是什么,不是.