移行ガイド
v30.0 の変更点
以下は、ライブラリのバージョンに加えられた破壊的変更と、それらの変更に対応するためにコードを更新する方法のリストです。
これは、v30.x のニュース発表およびv30.0 のリリースノートで発表された破壊的変更を対象としています。
CMake サブモジュールをフェッチされた依存関係に置き換えました
以前は、デフォルトの CMake の動作は Git サブモジュールを使用してピン留めされた依存関係を取得することでした。` -Dprotobuf_ABSL_PROVIDER=package ` を指定すると、CMake の設定が Abseil のローカルインストールを検索するように切り替わりました(jsoncpp と gtest にも同様のオプションがありました)。これらのオプションはもはや存在せず、デフォルトの動作はまずすべての依存関係のインストールを検索し、必要に応じて GitHub からピン留めされたバージョンをフェッチするフォールバックを行います。
フォールバックのフェッチ(以前の `package` の動作と同様)を防ぐには、次のように CMake を呼び出すことができます。
cmake . -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=ON
依存関係を固定バージョンから *常に* フェッチする(以前のデフォルトの動作と同様)には、次のように CMake を呼び出すことができます。
cmake . -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON
string_view 戻り値の型
以下の記述子 API の戻り値の型が `absl::string_view` になり、メモリを節約できるようになりました。
MessageLite::GetTypeNameUnknownField::length_delimited- FieldDescriptor::full_name` のような記述子 API の名前関数
今後の破壊的リリースでは、さらに多くの API が `absl::string_view` に移行されると予想されます。
ほとんどの場合、安全な場所では `absl::string_view` を使用するように型を更新するか、必要に応じて元の型に明示的にコピーするようにしてください。関数でこれが返される場合は、呼び出し元も更新する必要があるかもしれません。
影響を受ける API メソッドによって返される文字列が次のように使用されている場合
| 型 | 移行 |
|---|---|
| 既存の動作を維持するために `std::string` に明示的に変換します。 または、よりパフォーマンスの高い `absl::string_view` に切り替えます。 |
| `absl::string_view` に移行します。 実現不可能な場合(多数の依存関係のためなど)は、`std::string` にコピーする方が簡単な場合があります。 |
| null 許容の場合は、`std::optional それ以外の場合は、`absl::string_view` に移行します。 `absl::string_view` は null 終端が保証されていないため、`data()` を呼び出す際には注意が必要です。 |
一般的なコンテナやその他の API の場合、`absl::string_view` と互換性のあるバリアントに移行できる場合があります。以下にいくつかの一般的な例を示します。
| カテゴリ | 移行前 | 移行 |
|---|---|---|
| `std::vector |
|
|
| マップまたはセットへの挿入 |
|
|
| マップまたはセットのルックアップ |
| Abseil コンテナに移行します。 または、透過的な比較子を定義します。
https://abseil.io/tips/144 を参照してください。 |
| 文字列結合 |
|
これらはパフォーマンス上の理由から推奨されています。https://abseil.io/tips/3 を参照してください。 |
`absl::string_view` の使用に関する一般的なヒントについては、https://abseil.io/tips/1 も参照してください。
MSVC + Bazel のポイズニング
Windows の Bazel ユーザーは、この例のように、プロジェクトに以下を追加して clang-cl を使用するように切り替える必要があります。
.bazelrc
common --enable_platform_specific_config build:windows
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl
--extra_execution_platforms=//:x64_windows-clang-cl
MODULE.bazel
bazel_dep(name = "platforms", version = "0.0.10")
bazel_dep(name = "rules_cc", version = "0.0.17")
# For clang-cl configuration
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")
WORKSPACE
load("//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "protobuf_deps")
protobuf_deps()
load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains")
rules_cc_dependencies()
rules_cc_toolchains()
BUILD
Bazel 8 のみとの互換性が必要なユーザー向け。
platform(
name = "x64_windows-clang-cl",
constraint_values = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
"@bazel_tools//tools/cpp:clang-cl",
],
)
Bazel 7 と 8 の両方との互換性が必要なユーザー向け。
platform(
name = "x64_windows-clang-cl",
constraint_values = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
# See https://github.com/bazelbuild/rules_cc/issues/330.
"@rules_cc//cc/private/toolchain:clang-cl",
],
)
ユーザーは、次回の破壊的リリースまで、オプトアウトフラグ ` --define=protobuf_allow_msvc=true ` を設定することで一時的にエラーを抑制することもできます。
あるいは、MSVC の使用を継続したいユーザーは CMake の使用に切り替えることができます。これはVisual Studioで行うか、CMake コマンドラインに MSVC ジェネレータを指定することで行うことができます。例:
cmake -G "Visual Studio 17 2022" -A Win64 .
FieldDescriptor オプションから ctype を削除
`FieldDescriptor` オプションからの `ctype` の公開を停止しました。代わりに、v28 リリースで追加された `FieldDescriptor::cpp_string_type()` API を使用できます。
機密フィールドを編集するようにデバッグ API を変更
Protobuf C++ デバッグ API (Protobuf AbslStringify, `proto2::ShortFormat`, `proto2::Utf8Format`, `Message::DebugString`, `Message::ShortDebugString`, `Message::Utf8DebugString` を含む) は、`debug_redact` でアノテーションされた機密フィールドを編集するように変更されました。これらの API の出力にはプロセスごとのランダム化されたプレフィックスが含まれており、Protobuf TextFormat パーサーでは解析できなくなりました。ユーザーは、人間が読める出力が必要なほとんどのケース (ロギングなど) で新しい編集されたデバッグ形式を採用するか、シリアル化および逆シリアル化のためにバイナリ形式に切り替えることを検討する必要があります。古い逆シリアル化可能な形式が必要なユーザーは `TextFormat.printer().printToString(proto)` を使用できますが、これは機密フィールドを編集しないため、注意して使用する必要があります。
この件については、2024 年 12 月 4 日に公開されたニュース記事で詳しく読むことができます。
非推奨の API を削除しました
少なくとも1つのマイナーまたはメジャーリリースで非推奨(例:`ABSL_DEPRECATED`)とマークされ、廃止または置き換えられた以下の公開ランタイムAPIを削除しました。
API: Arena::CreateMessage
代替: Arena::Create
API: Arena::GetArena
代替: value->GetArena()
API: RepeatedPtrField::ClearedCount
代替: Arenaに移行してください(移行ガイド)。
API: JsonOptions
代替: JsonPrintOptions
C++14 サポートの終了
Foundational C++ Support matrix に従い、本リリースでは C++14 の最小サポートバージョンを削除し、C++17 に引き上げました。
ユーザーは C++17 にアップグレードする必要があります。
Arena で Oneof メッセージをクリアした後に ASAN ポイズニングを導入
この変更により、Arena を使用する C++ protobuf に影響を与える強化チェックが追加されました。protobuf アリーナに割り当てられた Oneof メッセージは、デバッグモードではクリアされ、ASAN モードではポイズンされます。クリア後、将来そのメモリ領域を使用しようとすると、ASAN で use-after-free エラーとしてクラッシュが発生します。
この実装には C++17 が必要です。
C++ CocoaPods リリースを終了しました
v4.x.x 以降壊れていた C++ CocoaPods のリリースを中止しました。C++ ユーザーは代わりに直接 GitHub リリースを使用してください。
Pythonでの変更
Python のメジャーバージョンが 5.29.x から 6.30.x に上がりました。
Python 3.8 のサポートを終了しました
最小サポート Python バージョンは 3.9 です。ユーザーはアップグレードする必要があります。
bazel/system_python.bzl エイリアスを削除しました
レガシーな `bazel/system_python.bzl` エイリアスを削除しました。
system_python.bzlへの直接参照を削除し、代わりにprotobuf_deps.bzlを使用するようにします。直接参照が必要な場合は、v5.27.0で移動されたpython/dist/system_python.bzlを使用してください。
フィールドセッターの検証に関する変更
Python および upb のフィールドセッターは、Edition 2023 に基づいてクローズド enum を検証するようになりました。無効な値で更新されたクローズド enum フィールドはエラーを生成します。
非推奨の py_proto_library マクロを削除しました
`protobuf.bzl` にあった非推奨の内部 `py_proto_library` Bazel マクロが削除されました。これは、v29.x で `bazel/py_proto_library` に移動された公式の `py_proto_library` に置き換えられました。この実装は、v29.x より前に `rules_python` で利用可能でした。
非推奨APIの削除
少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされていた以下の公開ランタイムAPIを削除しました。
リフレクションメソッド
API: reflection.ParseMessage、reflection.MakeClass
代替: message_factory.GetMessageClass()
RPCサービスインターフェース
API: service.RpcException、service.Service、service.RpcController、およびservice.RpcChannel
代替: バージョン2.3.0以降、RPC実装はこれらをベースに構築しようとせず、代わりに特定のRPC実装に固有のコードを生成するコードジェネレータプラグインを提供すべきです。
MessageFactoryおよびSymbolDatabaseメソッド
API: `MessageFactory.GetPrototype`、`MessageFactory.CreatePrototype`、`MessageFactory.GetMessages`、`SymbolDatabase.GetPrototype`、`SymbolDatabase.CreatePrototype`、および`SymbolDatabase.GetMessages`
代替: message_factory.GetMessageClass() および message_factory.GetMessageClassesForFiles()。
GetDebugString
API: GetDebugString
代替
代替はありません。これはもはやリリースされていないPython C++にのみ存在します。Pure PythonやUPBではサポートされていません。
Python のマップフィールドに対する setdefault の動作変更
`setdefault` は `ScalarMap` の `dict` に似ていますが、キーと値の両方を設定する必要があります。`MessageMaps` の `setdefault` は拒否されます。
Python のネストされたメッセージクラスの __qualname__ が外側のメッセージ名を含むように
Python のネストされたメッセージクラス `__qualname__` に、外側のメッセージ名が含まれるようになりました。以前は、ネストされたメッセージの場合、`__qualname__` は `__name__` と同じ結果であり、外側のメッセージ名は含まれていませんでした。
例:
message Foo {
message Bar {
bool bool_field = 1;
}
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before
Objective-Cでの変更
これは Objective-C の最初の破壊的リリースです。.
Objective-C のメジャーバージョンが 3.x.x から 4.30.x に上がりました。
既存の API のほとんどを非推奨にした未知のフィールド処理 API の見直し
`GPBUnknownFieldSet` は非推奨となり、`GPBUnknownFields` に置き換えられました。新しい型は、元の入力または API 呼び出しからの不明なフィールドの順序を保持し、メッセージが書き戻されるときに順序のセマンティックな意味が維持されるようにします。
これに伴い、`GPBUnknownField` 型も API 変更があり、既存の API のほとんどが非推奨となり、新しい API が追加されました。
非推奨のプロパティAPI
varintListfixed32Listfixed64ListlengthDelimitedListgroupList
非推奨の変更API
addVarintaddFixed32addFixed64addLengthDelimitedaddGroup
非推奨のイニシャライザ initWithNumber:。
新しいプロパティAPI
typevarintfixed32fixed64lengthDelimitedgroup
このタイプは、特定のフィールド番号のすべての値を *グループ化する* のではなく、単一のフィールド番号をその値でモデル化します。新しいフィールドを作成するための API は、`GPBUnknownFields` クラスの `add*` API です。
`-[GPBMessage unknownFields]` も非推奨になりました。代わりに、メッセージの不明なフィールドを抽出および更新するための新しい API があります。
非推奨の API を削除しました
少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされていた以下の公開ランタイムAPIを削除しました。
GPBFileDescriptor
API: -[GPBFileDescriptor syntax]
代替: 廃止されました。
GPBMessage mergeFrom:extensionRegistry
API: -[GPBMessage mergeFrom:extensionRegistry:]
代替: -[GPBMessage mergeFrom:extensionRegistry:error:]
GPBDuration timeIntervalSince1970
API: -[GPBDuration timeIntervalSince1970]
代替: -[GPBDuration timeInterval]
GPBTextFormatForUnknownFieldSet
API: GPBTextFormatForUnknownFieldSet()
代替: 廃止 - 不明なフィールドを含むGPBTextFormatForMessage()を使用してください。
GPBUnknownFieldSet
API: GPBUnknownFieldSet
代替: GPBUnknownFields
GPBMessage unknownFields
API: GPBMessage unknownFieldsプロパティ
代替: -[GPBUnknownFields initFromMessage:]、-[GPBMessage mergeUnknownFields:extensionRegistry:error:]、および-[GPBMessage clearUnknownFields]
古い Gencode の非推奨のランタイム API を削除しました
このリリースでは、3.22.x リリース以前の Objective-C gencode をサポートしていた非推奨のランタイムメソッドを削除しました。また、古い生成されたコードが起動する際に、ランタイムでログメッセージを発行します。
API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]
代替: ライブラリの最新バージョンで再生成してください。
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
代替: ライブラリの最新バージョンで再生成してください。
API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]
代替: ライブラリの最新バージョンで再生成してください。
代替: ライブラリの最新バージョンで再生成してください。
API: -[GPBExtensionDescriptor initWithExtensionDescription:]
代替: ライブラリの最新バージョンで再生成してください。
ポイズンピルの警告
新しいローリングアップグレードポリシーの下で動作するが、*次* のメジャーバージョンアップで壊れることになる、古い gencode と新しいランタイムの組み合わせについて警告を発するようにポイズンピルを更新しました。たとえば、Python 4.x.x gencode は 5.x.x ランタイムに対して動作しますが、6.x.x ランタイムに対する今後の破損について警告を発します。
C#とRubyにおけるUTF-8強制の変更
言語間で UTF-8 の強制を統一するための修正を加えました。文字列フィールドに不正な非 UTF-8 データを持つユーザーは、以前よりも早く UTF-8 強制エラーに遭遇する可能性があります。
JSON 解析における Ruby と PHP のエラー
JSON 仕様に従い、数値フィールド内の文字列の JSON 解析における非準拠を修正しました。
この修正はメジャーバージョンアップを伴いませんが、Ruby と PHP は、数値フィールド内の非数値文字列(`""`、`"12abc"`、`"abc"` など)に対してエラーを発生させるようになりました。v29.x には、これらのエラーケースに対する警告が含まれています。
v22.0 のコンパイラの変更点
JSON フィールド名の競合
JSON マッピングに関するフィールド名の競合の扱いについて、いくつかの微妙な変更を加えました。proto3 では、制限を部分的に緩和し、フィールド名が大文字と小文字を区別する JSON マッピング(元の名前のキャメルケース)を生成する場合にのみエラーを出すようにしました。また、`json_name` オプションもチェックし、大文字と小文字を区別する競合に対してエラーを出すようにしました。proto2 では、制限を少し厳しくし、2つの `json_name` の指定が競合する場合にエラーを出すようにしました。暗黙的な JSON マッピング(キャメルケース)に競合がある場合は、proto2 で警告を出すようにします。
レガシーな動作を復元するためのメッセージ/enum オプションを一時的に提供しました。競合するフィールドの名前変更をすぐに実行できない場合は、特定のメッセージ/enum に `deprecated_legacy_json_field_conflicts` オプションを設定してください。このオプションは将来のリリースで削除されますが、移行のための時間を稼ぐことができます。
v22.0 の C++ API の変更点
4.22.0 には、C++ ランタイムと protoc に対する破壊的変更があります。8月に発表されました。
Autotools の廃止
変更元: PR #10132
v22.0 では、protobuf コンパイラと C++ ランタイムからすべての Autotools サポートを削除しました。これらのいずれかを構築するために Autotools を使用している場合は、CMake または Bazel に移行する必要があります。protobuf を CMake でセットアップするための専用の説明があります。
Abseil 依存関係
変更元: PR #10416
v22.0 では、Abseil への明示的な依存関係を採用しました。これにより、以前は古い内部コードから分岐し、後に Abseil となったほとんどの stubs を削除することができました。いくつかの微妙な動作変更がありますが、ほとんどはユーザーには透過的であるはずです。注目すべき変更点には以下が含まれます。
string_view - 多くの API で `absl::string_view` が `const std::string&` に置き換わりました。これは入力引数で最も一般的に使用され、ユーザーには目立った変更はないはずです。いくつかのケース (仮想メソッド引数や戻り値の型など) では、ユーザーは新しいシグネチャを使用するために明示的な変更を加える必要があるかもしれません。
テーブル - STL のセット/マップの代わりに、Abseil の `flat_hash_map`、`flat_hash_set`、`btree_map`、`btree_set` を使用するようになりました。これらはより効率的で、異種ルックアップを可能にします。これはほとんどのユーザーには見えないはずですが、テーブルの順序に関連する微妙な動作変更を引き起こす可能性があります。
ロギング - Abseil のロギングライブラリは、当社の古いロギングコードと非常によく似ており、スペルが少し異なるだけです(例: `GOOGLE_CHECK` の代わりに `ABSL_CHECK`)。最大の違いは、例外をサポートしていないため、`FATAL` アサーションが失敗すると常にクラッシュするようになったことです(以前は例外に切り替えるための `PROTOBUF_USE_EXCEPTIONS` フラグがありました)。これらは深刻な問題が発生した場合にのみ発生するため、無条件のクラッシュが適切な対応であると考えています。
ロギング変更のソース: PR #11623
ビルド依存関係 - 新しいビルド依存関係は、常に下流のユーザーに破壊を引き起こす可能性があります。ビルドには Abseil LTS 20230125 以降が必要です。
Bazel ビルドの場合、`WORKSPACE` から `protobuf_deps` が実行されると、Abseil はピン留めされた LTS リリースで自動的にダウンロードされ、ビルドされます。これは透過的であるはずですが、古いバージョンの Abseil に依存している場合は、依存関係をアップグレードする必要があります。
CMake ビルドの場合、まずトップレベルの CMake 設定で引き込まれた既存の Abseil インストールを探します(説明を参照)。それ以外の場合、`protobuf_ABSL_PROVIDER` が `module`(デフォルト)に設定されている場合は、Git サブモジュールから Abseil をビルドしてリンクしようとします。`protobuf_ABSL_PROVIDER` が `package` に設定されている場合は、プリインストールされたシステムバージョンの Abseil を探します。
GetCurrentTime メソッドの変更点
Windows では、`GetCurrentTime()` はシステムによって提供されるマクロの名前です。v22.x 以前の Protobuf は、`GetCurrentTime()` のマクロ定義を誤って削除していました。そのため、`
アプリを新しい動作に移行するには、コードを次のいずれかに変更してください。
- `GetCurrent` マクロが定義されている場合、`GetCurrentTime` マクロを明示的に未定義にする
- `(google::protobuf::util::TimeUtil::GetCurrentTime)()` または同様の式を使用してマクロ展開を防ぐ
例:マクロの未定義化
Windows からマクロを使用しない場合は、このアプローチを使用してください。
変更前
#include <google/protobuf/util/time_util.h>
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
変更後
#include <google/protobuf/util/time_util.h>
#ifdef GetCurrentTime
#undef GetCurrentTime
#endif
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
例2:マクロ展開の防止
変更前
#include <google/protobuf/util/time_util.h>
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
変更後
#include <google/protobuf/util/time_util.h>
void F() {
auto time = (google::protobuf::util::TimeUtil::GetCurrentTime)();
}
C++20 サポート
変更元: PR #10796
C++20 をサポートするために、C++ で生成される protobuf コードで新しいキーワードを予約しました。他の予約済みキーワードと同様に、フィールド、enum、またはメッセージにこれらを使用した場合、有効な C++ にするためにアンダースコアの接尾辞を追加します。たとえば、`concept` フィールドは `concept_()` ゲッターを生成します。これらのキーワードを使用する既存のプロトがあるシナリオでは、それらを参照する C++ コードを更新して、適切なアンダースコアを追加する必要があります。
最終クラス
変更元: PR #11604
Protobuf ライブラリで行われている仮定を強化するための大規模な取り組みの一環として、継承することを意図していなかった一部のクラスを `final` とマークしました。これらのクラスから継承する既知のユースケースはなく、そうすることは問題を引き起こす可能性が高いです。コードがこれらのクラスから継承している場合、回避策はありませんが、継承を使用している正当な理由があると思われる場合は、Issue を開いてください。
コンテナの静的アサーション
変更元: PR #11550
Protobuf ライブラリにおける仮定を強化するための大規模な取り組みの一環として、`Map`、`RepeatedField`、および `RepeatedPtrField` コンテナに静的アサーションを追加しました。これらは、ドキュメントに記載されているように、これらのコンテナを予期される型のみで使用していることを保証します。これらの静的アサーションに遭遇した場合は、コードを Abseil または STL コンテナを使用するように移行する必要があります。`std::vector` は repeated field コンテナの優れたドロップイン代替品であり、`Map` の場合は `std::unordered_map` または `absl::flat_hash_map` (前者は同様のポインタ安定性を提供し、後者はより効率的です)が適しています。
クリアされた要素の非推奨化
`RepeatedPtrField` の「クリアされたフィールド」に関する API は非推奨となり、将来の破壊的リリースで完全に削除される予定です。これは元々、クリアされた要素を再利用するための最適化として追加されましたが、うまく機能しませんでした。この API を使用している場合は、メモリの再利用を改善するためにアリーナに移行することを検討してください。
UnsafeArena の非推奨化
変更元: PR #10325
アリーナセーフではないAPIを削除するための大規模な取り組みの一環として、`RepeatedField::UnsafeArenaSwap` を非表示にしました。これまでに削除したのはこれだけですが、今後のリリースでは引き続き削除し、アリーナ間で効率的な借用パターンを処理するヘルパーを提供します。単一のアリーナ(またはスタック/ヒープ)内では、`Swap` は `UnsafeArenaSwap` と同じくらい効率的です。利点は、異なるアリーナ間で誤って呼び出しても無効なメモリオペレーションを引き起こさないことです。
マップペアのアップグレード
変更元: PR #11625
v22.0 では、`Map` API を Abseil と STL とより一貫性のあるものにするためにクリーンアップを開始しました。特に、`MapPair` クラスを `std::pair` のエイリアスに置き換えました。これはほとんどのユーザーにとって透過的であるはずですが、このクラスを直接使用していた場合は、コードを更新する必要があるかもしれません。
新しい JSON パーサー
変更元: PR #10729
このリリースで C++ JSON パーサーを書き直しました。ほとんどは隠れた変更であるはずですが、必然的にいくつかの未文書化の癖が変更されている可能性があります。それに応じてテストしてください。有効な RFC-8219 JSON ではないドキュメント(引用符が欠けているものや非標準のブール値を使用しているものなど)の解析は非推奨となり、将来のリリースで削除されます。フィールドのシリアル化順序は、以前は非決定論的でしたが、フィールド番号の順序と一致することが保証されるようになりました。
この移行の一環として、util/internal 以下にあるすべてのファイルが削除されました。これらは古いパーサーで使用されており、外部で使用されることを意図していませんでした。
Arena::Init
変更元: PR #10623
`Arena` の `Init` メソッドは何も行わないコードであり、現在は削除されました。このメソッドを呼び出していた場合、おそらく `Arena` コンストラクタを `ArenaOptions` のセットで直接呼び出すことを意図していたでしょう。その呼び出しを削除するか、そのコンストラクタに移行する必要があります。
ErrorCollector 移行
変更元: PR #11555
Abseil への移行の一環として、`const std::string&` から `absl::string_view` へと移行しています。3 つのエラーコレクタークラスについては、既存のコードを壊すことなくこれを行うことはできません。v22.0 では、両方のバリアントをリリースし、メソッド名を `AddError` および `AddWarning` から `RecordError` および `RecordWarning` に変更することを決定しました。古いシグネチャは非推奨とマークされており、わずかに非効率になります(文字列コピーのため)が、それ以外は引き続き機能します。`Add*` メソッドは将来の破壊的リリースで削除されるため、これらを新しいバージョンに移行する必要があります。