4

在红宝石生态系统(或什至其他地方)中是否有SemVer的功能(即,我可以将其与bundlerand一起使用rubygems)替代方案?

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

  1. 改变大小(补丁——一个小改变)
  2. 向后兼容性(次要——不间断,主要——破坏)

但是, PATCH仍然很可能是一个重大更改,这使得它在某种程度上等于MAJOR而小于MINOR,并且MINOR小于MAJOR。所以:

  PATCH == MAJOR  && MAJOR > MINOR && MINOR > PATCH

这意味着 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 列))
4

1 回答 1

6

rubygems/bundle 不支持有两个不同的并行版本号,不。

但是没有理由你必须使用 semver。您只需要一个版本号。Bundler 和 ruby​​gems 可以与“xyz”,甚至“xy”或“xyzab”形式的任何版本号一起正常工作,其中所有组件都是数字。就“功能”而言,您可以使用一个版本号做任何您想做的事情。(如果你使用字母而不仅仅是数字,rubygems 可能会认为它表示“预发布”版本。但如果你坚持使用数字,你可以做任何你想做的事情)。

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

我不确定你是否误解了 semver。Semver 说,重大更改必须是主要版本的增量。如果“不过,PATCH 仍然很可能是一个重大变化”,那么你就没有在做 semver。根据 semver 的说法,重大更改必须是主要版本的提升。这并不总是被遵循,要么是因为意外的错误,要么是因为不了解 semver 的人,或者不愿意遵循它但想说他们无论如何都在遵循它——但这就是 semver 所说的。

实际上,semver 说版本号应该与兼容性有关,而不是关于更改的“大小”(无论是主观的“大”还是字节大小;您似乎在谈论字节大小增量,我从未见过对版本的解释之前的数字)。向后的重大更改需要一个主要的版本提升;没有向后突破性更改的新功能需要较小的版本提升;否则(没有新功能,没有向后突破的变化;所以基本上是错误修复或内部重构)补丁级别的颠簸。Semver没有尝试合并两个不兼容的东西——而是试图完全抛弃其中一个,它抛弃了版本号应该代表“更改大小”的想法,它只代表兼容性。人们对此的抵制虽然是对 semver 的一些抵制,但确实如此。

我不确定您所说的“潜在的不可察觉的破坏性变化”是什么意思。Semver 说重大更改是主要版本的颠簸,如果它“潜在地不知不觉地破坏”,你就不能称它为补丁,我猜这意味着只有一些人会注意到它,而你猜大多数人不会?Semver 对此类类别不感兴趣。Semver 不允许您在补丁级别版本中发布重大更改,因为您认为它是“潜在的不可察觉的破坏”(也许您愿意?)。

版本控制和发布管理很难。这通常是维护者的痛苦和下游用户的痛苦之间的平衡。我怀疑创建两个单独的并行版本号是否会改善事情,而不仅仅是让事情对任何人来说更加混乱。我什至不明白你会如何实现“我不想让你下载那个,但请给我带来你在 H2.0 系列中所做的那些不间断的改进”——听起来你想象的不仅仅是两个每个版本的版本号,但实际上是两个完全不同的版本号“行”

好的,我想您可以这样做,只需使用两个不同的 gem 名称发布即可。Widget_H 和 Widget_B,我猜?我猜你的仓库中有两个不同的 git 分支?我不知道,我很难弄清楚你的想法如何可能被应用到一个系统中,即使是假设的。看起来它会让维护者和下游用户感到非常困惑——但是在 ruby​​gems/bundle 生态系统中只使用两个不同的 gem 名称就可以实现你想要的吗?

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

于 2015-02-28T15:17:46.700 回答