web-dev-qa-db-ja.com

メジャーバージョンに上位互換性を要求することの長所と短所は何ですか?

だから私は前方互換性について学んでいて、依存関係に後方互換性があるが前方互換性がないこと、そしてその逆であることを「依存関係」に警告できるかどうか疑問に思っていました。

SemVer仕様では、以下が必要です。

7。 マイナーバージョンY(xYz | x> 0)は、新しい下位互換性のある機能の場合、インクリメントする必要があります(-===-)[強調]パブリックAPIに導入されました。 [...]

8。 メジャーバージョンX(X.y.z | X> 0)は、後方互換性のない変更がパブリックAPIに導入された場合、インクリメントする必要があります。 それはマイナーとパッチレベルの変更を含めることができます。[鉱山を強調] [ ...]

私にとって、それは次のことを意味します:

  • 下位互換性があるが、上位互換性がない*変更を行う場合は、マイナーバージョンをインクリメントする必要があります。実際、「パブリックAPIに新しい[...]機能[...]」を導入し、依存関係が依存関係をアップグレードして使用する場合、依存関係は、ダウングレードによって依存関係が壊れないことを保証できません。後方互換性のミラーバージョン。つまり、「新しい[...]機能[...]をパブリックAPIに追加する」には後方互換性があり、前方互換性はありません*。ある意味、後方互換性があり、前方互換性がない*変更は、 、「新しい[...]機能[...]をパブリックAPIに追加」します。これは、反例(および必要に応じて説明できるその他の理由)が見当たらないため、基本的に同等にするためです。
  • 下位互換性のない変更を行う場合は、メジャーバージョンを増やす必要があります。上位互換性がある場合とそうでない場合があります。
  • 後方互換性と前方互換性*の変更を行う場合は、削除することで(そして、必要に応じて説明できるのと同じ他の理由で)、パッチのバージョンを上げる必要があります。

私が正しいと仮定します。また、後方互換性も前方互換性もないすべての変更*は、後方互換性と前方互換性*(またはその逆)の2つの連続する変更に分離できると仮定します。
つまり、下位互換性はないが上位互換性*の変更を他の変更から常に分離でき、下位互換性も前方互換性もない変更*が発生しないことを意味します。
したがって、次のように再定義できます:

  • 下位互換性のない変更を少なくとも1つ含む、上位互換*バージョンとしてのメジャーバージョン
  • 下位互換バージョンとしてのマイナーバージョン。少なくとも1つの前方互換性のない変更を含みます。

新しいメジャーバージョンM.0.p依存関係は、依存関係によって安全にダウングレードできます。前のメジャーバージョンの最後のマイナーバージョンまで、それを(M-1).m.0

私が正しいと仮定します。 依存関係のバージョンが前方互換性があることが保証されていることを知ることは、依存関係にとって有益か役に立たないでしょうか*?
SemVerへの追加の制約の長所と短所は何ですか?

(私の推論を確認することはこの質問の目的ではありません、私は考えすぎていることを知っていますが、この推論が何らかの形で役立つかどうか知りたいだけですが、あなたの意見をいただければ幸いです)


編集:「前方互換」の後に「*」があるところはどこでも、「安全にダウングレード可能」を意味しました。
確かに、バージョンに下位互換性がある場合、それは以前のバージョンが安全にアップグレード可能であることを意味します。したがって、バージョンに上位互換性がある場合、nextバージョンは安全にダウングレードできることを意味します。また、次のバージョンがリリースされる前に、そのバージョンの前方互換性を保証できないことも意味します。したがって、新しいバージョンが下位互換性があるか、安全にダウングレードできることは保証できますが、上位互換性があるか、安全にアップグレードできることは保証できませんまだ

4
CidTori

ほとんどすべての変更は、その性質上、前方互換性がありません。

  • バグを修正してパッチをリリースすると、ダウングレードするとそのバグが発生します。
  • 新しい機能を導入した場合、ダウングレードするとその機能が削除されるため、コードをコンパイルできない状態のままにする可能性があります。
  • 重大な変更を行うと、その変更はどちらの方向にも影響します。たとえば、FooBarに変更してからBarを使用すると、以前のバージョンにダウングレードできませんバージョン。

コメントで言うように、これに対する1つの例外は、小さな変更を使用してエイリアスを導入し、次に大きな変更を使用してオリジナルを削除し、エイリアスのみを残すことです。この特定の状況では、大きな変更は前方互換です。

したがって、8を次のように変更できます。

メジャーバージョンX(X.y.z | X> 0)は、後方互換性のない変更がパブリックAPIに導入された場合、インクリメントする必要があります。マイナーおよびパッチレベルの変更が含まれる場合があります。 前方互換性のある変更が含まれる場合があります。メジャーバージョンが増加する場合、パッチとマイナーバージョンを0にリセットする必要があります。

しかし、「可能性がある」としか言えないので、前方互換性はEdgeの場合なので、人々に混乱を与え、前方互換性のある条項の目的を尋ねる以外に、これで何ができるでしょうか。

4
David Arno