web-dev-qa-db-ja.com

最後の大きな変更を元に戻すときにセマンティックバージョン番号を変更する方法

私は、セマンティックバージョニング番号、特にメジャーリリース番号(APIの変更と後方互換性を示しているため)を比較することにより、さまざまなコンポーネントの互換性を検証するシステムを計画しています。正確な答えが見つからない次のシナリオに遭遇しました。

コードがバージョン2.3.5上にあり、新しいメジャーAPI変更を追加したため、バージョンを3.0.0に更新するとします。ただし、リリースの数日後、この変更がユーザーのニーズに合わないことがわかりました。バージョン2.x.xと互換性があったすべてのものが再び互換性を持つように、この変更を元に戻します(私はバージョン管理を元に戻しますが、古いバージョンのコードを通常のコミットに戻します)。新しいバージョンを4.0.0にする必要があるかどうかわかりません。APIに大きな変更を加え、番号を常にインクリメントする必要があるためです。また、下位互換性があるため、2.4.0を使用してください。 。

どちらのソリューションにも利点と問題があるようです。そのような場合の基本ルールまたはベストプラクティスはありますか?

23
Josef

なぜあなたは [〜#〜]すべき[〜#〜] semverによると、新しいメジャーバージョンに行くのですか

Semver は推奨事項であり、規制ではありません。Bartの提案に従い、最終的に決定するのはあなた次第です。ただし、semverに準拠する場合は、次のメジャーバージョンに進む必要があります。最初:

  1. バージョン管理されたパッケージがリリースされたら、そのバージョンの内容を変更してはなりません。 変更はすべて新しいバージョンとしてリリースする必要があります

第二に、semverはバージョンの増加のみを定義しているため:

  1. メジャーバージョンXは、パブリックAPIに下位互換性のない変更が導入された場合、インクリメントする必要があります。

なぜあなたは SHOULD NOT バージョン番号を前に戻す

まず第一に、完全に以前の、まだまだメンテナンスされているバージョンのメンテナンスリリースを作成することが可能です。したがって、ブランチ2.3.52.4.0、および3.0.0がある場合、ブランチ間にオーバーラップを作成しない限り、バグ修正2.3.6または(下位互換)機能バージョン2.5.0を作成できます。

ただし、シナリオは異なります:メインバージョンに戻ると、不整合が発生します。たとえば、2.4.0にアクセスするとします。

  1. の 最新 最も高度なバージョンは最大数ではなくなります。これにより、バージョン番号の増加に関する多くの前提が崩れます。例えば:
    ウィキペディアのページで、最新の安定版としてどのバージョンを表示しますか?バージョン3.0.0の顧客は、最新の安定したバージョンより後のバージョンがあることを発見した場合、あなたとあなたの信頼性をどう思いますか?お客様が最も高度な機能を探している場合、どのバージョンをダウンロードしますか?
  2. 新しい主要な進化により、競合を回避するために新しい番号付けの課題が発生する可能性があります。
    2.4.0の後に新しいメジャーバージョンを導入する場合は、メジャーバージョンを増やす必要があります。したがって、再び3.0.0に戻ります。 3.1.0を使用しますか(ただし、新しいバージョンはまったく異なる方向に進み、ansは以前のバージョンの3.0.0と互換性がありません)?または、バージョン4.0.0に直接ジャンプしますか?この場合、残忍なバージョン番号の増加のみを延期することになります。
  3. バージョン3.0.0のAPIが 非推奨 であることをどのように文書化しますか?
    "API 3.0.0はバージョン2.4.0以降では非推奨です"?本当に?
  4. 連鎖反応!公式リリースには影響があります。クライアントにもバージョン管理されたパッケージがある場合があります。結局のところ、それは semverの意味 です。逆方向の番号付けは、独自のバージョン管理と自動化された依存関係管理ツールの推奨を台無しにする可能性があります。
    例:「私たちのパッケージ7.1を使用する場合、彼のコンポーネント3.0.0が必要です;私たちのパッケージ7.2を使用する場合、彼のコンポーネント2.4.0が必要です」-本当に?

結論

私は厳守することをお勧めします。 Semverは、マーケティング目的または親和性のために設計されていません。多くのコンポーネント間の多くの依存関係の管理を容易にするように設計されています。 (一貫性のある)数値ジャンプは、逆方向の番号付けが壊れる可能性があるという仮定と比較して、実際には小さな不便です。

29
Christophe

通常、セマンティックバージョニングなどの場合、技術的に何かを達成する方法は関係ありませんが、達成しようとしていることの意図は何ですか。

バージョン3.0.0のロールバックの意図が、バージョン3.0.0で導入された機能をメジャーバージョンの更新を強制せずに2.xyバージョンのユーザーにも提供することである場合、バージョン2.4.0を呼び出すのが正しいでしょう。 。
3.x.yバージョンの将来は関係ありません。 3.x.yバージョンを2.x.yバージョンと一緒に保守するのか、どちらか一方のみを保守してもう一方を廃止するのかは問題ではありません。

新しいメジャーバージョンを作成する意図があり、2.x.yバージョンとの互換性が単なる偶然である場合は、新しいバージョン4.0.0を呼び出すのが正しいでしょう。

誰もあなたのものを使用していない場合は、好きな数を選択できます。

ただし、世界にリリースした場合、「古い」バージョンをインストールする人は誰もいません。

バグを見つけた場合や、新しいバージョンと互換性のない他の古いものを使用している場合などは問題ありませんが、これらすべてのシナリオで問題が発生し、回避策が見つかりました。それは幸せな道ではありません。

新機能を備えたv3をリリースした場合、正常にロールバックすることはできません。バグがある場合は、v3.0.0.1などで修正して修正する必要があります。

それが間違った方向であり、別の機能セットを使用して前進している場合、人々にv3よりも使用してもらいたい場合、または「最新」であることを知ってもらいたい場合は、v4をリリースする必要があります。

「v3は悪かったので無視してv2を使用して」と人々に伝える方法はありません。

1
Ewan