4

Rubyエコシステム内(または他の場所でも)にSemVerに代わる機能する(つまり、bundlerand で使用できる)ものはありますか?rubygems

SemVer ( MAJOR.MINOR.PATCH ) に関する私の問題は、2 つの互換性のないものを定量化しようとすることです。

  1. サイズの変更 (パッチ-- 小さな変更)
  2. 下位互換性 (マイナー-- 非互換、メジャー-- 互換性なし)

ただし、 PATCHは依然として互換性を破る変更である可能性が非常に高く、これにより、MINORよりも小さい一方でMAJORと同等になり、MINORはMAJORよりも小さくなります。それで:

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

これは、同時に PATCH <> MINOR であることを意味しますが、これは決して真ではありません。

理想的には、2 つのバージョニング ラインを作成したいと考えています。1 つは下位互換性に基づいており (たとえば、壊れていない、潜在的に知覚できない破損 (==パッチ)、壊れている)、もう 1 つは変更サイズに基づいています (下位互換性は無視)。もしそうなら、バージョン管理行。そして、それらを同時に使用できるようにしたいと思います。

(純粋な下位互換性ベースのバージョン管理だけで、「hello world」を画面に表示してオペレーティング システムが起動する限り、「hello world」からオペレーティング システムに移行できます。)

例: Hが人間に優しいバージョン管理を表し、Bが下位互換性に基づく下位互換性を表す場合、次のように言えます。

  1. ~> H2.0 (== H2.X に固執します。200MB の非破壊的な追加機能を追加するバージョン H3.0 を作成する場合、それをダウンロードしてほしくありませんが、あなたが行った非破壊的な改善を私にもたらしてくださいH2.0ライン)
  2. ~> B0.1 (==互換性を損なわない変更(3 列目、Semver の 2 列目と同等) と潜在的に破壊的な 変更 (2 列目、SemVer の 3 列目と同等) を教えてください)
4

1 に答える 1

6

rubygems/bundler では、2 つの異なる並行バージョン番号を持つことはサポートされていません。

しかし、semver を使用しなければならない理由はありません。必要なバージョン番号は 1 つだけです。Bundler と ruby​​gems は、すべてのコンポーネントが数字である「xyz」、または「xy」または「xyzab」の形式のバージョン番号で問題なく動作します。「機能する」限り、1 つのバージョン番号で、やりたいことが何でもできます。(数字だけでなく文字を使用すると、rubygems はそれが「プレリリース」バージョンを示していると判断する可能性があります。しかし、数字に固執する場合は、好きなことを行うことができます)。

semver 以前は、多くの人は、大きな変更、小さな変更、または小さな変更のように「思われた」ときに、そのように感じたときにコンポーネントをインクリメントしていました。確かにそれを行うことができます-または、適用する単一のバージョン番号を決定するために他のシステムを使用します-インフラストラクチャは正常に機能します. 下流のユーザーはそれを評価するかもしれませんし、しないかもしれません。

ただし、semverを誤解しているかどうかはわかりません。Semver は、重大な変更はメジャー バージョンのインクリメントでなければならないと述べています。「ただし、PATCH は依然として重大な変更である可能性が高い」場合は、semver を行っていません。semver によると、重大な変更はメジャー バージョンの更新である必要があります。これは、偶発的なバグのため、またはsemverを理解していないか、それに従うことを望まないが、とにかくフォローしていると言いたい人のために、常に従うとは限りません-しかし、それはsemverが言うことです.

実際、semver は、バージョン番号は、変更の「サイズ」(主観的な「大きさ」であれバイトサイズであれ) ではなく、互換性に関するものであるべきだと言っています。あなたはバイトサイズのデルタについて話しているようですが、バージョンの解釈を見たことがありません。前の数字)。後方破壊的変更には、メジャー バージョンの更新が必要です。後方破壊的な変更のない新機能には、マイナー バージョン バンプが必要です。それ以外の場合 (新機能なし、後方破壊的な変更なし。つまり、基本的にバグ修正または内部リファクタリング) パッチ レベルのバンプ。センバーはしませ2 つの互換性のないものを取り込もうとします。むしろ、そのうちの 1 つを完全に破棄しようとします。バージョン番号は「変更のサイズ」を表す必要があるという考えを破棄し、互換性を表すだけです。しかし、これに対する人々の抵抗は、semverに対する抵抗の一部です。

「いつの間にか変化を壊す可能性がある」とはどういう意味かわかりません。Semver は、破壊的変更はメジャー バージョン バンプであると述べています。それが「いつの間にか壊れる可能性がある」場合、それをパッチと呼ぶことはできません。Semver は、そのようなカテゴリには関心がありません。Semver では、パッチ レベル リリースで重大な変更をリリースすることは許可されていません。これは、それが「いつの間にか壊れる可能性がある」と判断したためです (それを望んでいるのでしょうか?)。

バージョン管理とリリース管理は大変です。多くの場合、メンテナの苦痛と下流のユーザーの苦痛のバランスです。2 つの別々の並行バージョン番号を作成することで、状況がさらに混乱するだけでなく、状況が改善されるかどうか、私は懐疑的です。「それをダウンロードしてほしくないが、H2.0 ラインで行った非破壊的な改善を私にもたらしてほしい」という実装方法も理解できません。2 つだけではないと想像しているようです。リリースごとにバージョン番号が表示されますが、実際にはバージョン番号のまったく異なる「行」が 2 つありますか?

2 つの異なる gem 名でリリースするだけでよいでしょ。Widget_H と Widget_B ですね。レポ内の 2 つの異なる git ブランチから離れていると思いますか? わかりません。あなたの思索がどのようにシステムに運用化される可能性があるのか​​ を理解するのに苦労しています. メンテナーとダウンストリーム ユーザーの両方にとって、非常に混乱を招くように思えますが、2 つの異なる gem 名を使用するだけで、rubygems/bundler エコシステムで必要なことを実現できますか?

semverの仕様をまだ読んでいない場合は、読むことを強くお勧めします。そうすることで、semver とは何かを理解できます。

于 2015-02-28T15:17:46.700 に答える