注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このドキュメントでは、関数に使用されるバージョン管理システムについて説明します。関数のリリースバージョンは公開者が選択し、作成後は変更できません。関数の利用者に安定した信頼性の高い利用環境を提供するには、適切なバージョンを適用することが重要です。
関数のバージョン管理システムでは、下位互換性のある変更と破壊的変更を区別します。下位互換性のある変更とは、関数の既存の利用者に支障をきたさない変更です。下位互換性のない変更は、下位互換性のない変更または破壊的変更と呼ばれます。
下位互換性のある変更の例は次のとおりです。
破壊的変更の例は次のとおりです。
既存のバージョンに対する変更に下位互換性があるかどうかを検討する際は、その変更が既存バージョンの利用者に支障をきたすか、または利用者による明示的な対応が必要になるかを考えてください。
関数に期待される利用方法を最終的に決めるのは、関数の公開者であることを忘れないでください。
関数のバージョンは、セマンティックバージョニング ↗システムに従って管理されます。
セマンティックバージョニングでは、バージョンは X.Y.Z の形式を取ります。X はメジャーバージョン、Y はマイナーバージョン、Z はパッチバージョンと呼ばれ、いずれも非負の整数です(例:1.2.3)。また、パッチバージョンの直後にハイフンを付け、英数字で構成されるプレリリース識別子を追加することもできます(例:1.2.3-rc1)。
このページでは、セマンティックバージョニングの概要を簡単に説明します。他のアプリケーションで確実に利用できる関数を公開するには、仕様を遵守することが重要なため、仕様の全文 ↗を読むことを推奨します。
関数の新しいバージョンを公開する際は、セマンティックバージョニング仕様の次の点を考慮してください。
0(0.y.z)は初期開発用です。初期開発中は関数がいつでも変更される可能性があり、利用者は関数を安定しているとみなすべきではありません。新しいバージョンを公開する前に、関数の下位互換性チェックが実行されます。具体的には、次の破壊的変更のいずれかがあると警告が表示されます。
何らかの理由でこれらのチェックに失敗した場合は、メジャーバージョンとしてリリースすることを推奨します。ただし、まだ初期開発段階にある場合(つまり、メジャーバージョンがまだ 0 の場合)は、この限りではありません。
Palantir の組み込みチェックは、すべての種類の破壊的変更を網羅しているわけではありません。たとえば、内部実装に起因する破壊的変更は検出されない可能性があります。これらのチェックに成功したという結果だけを根拠に、マイナーバージョンやパッチバージョンをリリースすることは安全ではありません。
関数の内部データ型表現には、現在、カスタム型のフィールドの任意性に関する情報が十分に含まれていません。そのため、カスタム型の入力と出力では、任意のフィールド(TypeScript の quantity?: Integer や Python の quantity: Integer = 0 など)も含め、どのフィールドを削除または追加しても、下位互換性チェックで警告が表示される場合があります。
現在、出力のカスタム型から任意のフィールドを削除した場合や、入力のカスタム型に任意のフィールドを追加した場合に、今後は警告が表示されないように変更を進めています。
入力のカスタム型から任意のフィールドを削除した場合は、引き続き警告が表示されます。利用者が指定したフィールドによって関数の動作が決まることを期待している可能性が高いため、利用者が指定したフィールドを無視することは、一般に望ましくない慣行とされています。
下流の本番アプリケーションがバージョン範囲(例:>=1.2.3 <2.0.0)で関数を参照するように設定されている場合、セマンティックバージョニングの安定リリース(プレリリースではないバージョン)は、それらのアプリケーションですぐに利用される可能性があります。そのため、新しい安定バージョンとしてリリースする前に、コードの変更をレビューし、テストすることが重要です。
保護されたブランチのリポジトリ設定でトグルを有効にすることで、関数の安定バージョンのリリースに制限を適用できます。
一般的には、破壊的変更はマイナーリリースで行い、下位互換性のある変更はパッチリリースで行います。これは、Node/NPM エコシステムなど、多くの開発分野で利用者が前提としている慣行であり、キャレット範囲 ↗が広く使われていることにも表れています。
破壊的変更をリリースしたことに気づいたら、すぐに問題を修正し、新しいマイナーバージョンで下位互換性を回復する必要があります。
次の例を考えてみます。
1.0.0 の myFunction という関数があり、文字列の入力を1個受け取ります。myFunction に新しい必須の入力を追加し、この変更を誤ってマイナーバージョン 1.1.0 としてリリースします。これを修正するには、シグネチャに対する破壊的変更を元に戻し(つまり、1.1.0 で追加した新しい必須の入力を削除し)、この変更をバージョン 1.2.0 としてリリースします。
TypeScript または Python の関数の場合、公開に失敗したり、公開に数分かかったりすることがあります。どちらの場合も、組み込みの下位互換性チェックは実行できません。新しいリリースを行う前にこれらのチェック結果を確認したい場合は、次の方法があります。