[インデックス 18557] ファイルの概要
このコミットは、Go言語のAPI互換性チェック機構において、unicode
パッケージのVersion
定数への変更をホワイトリストに追加するものです。これにより、ビルドが中断される問題が解消されました。
コミット
commit ac40fb44701c7a920310e18d22777196bdf8e581
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Tue Feb 18 13:38:47 2014 -0800
api: whitelist change to unicode.Version
Unbreaks the build.
LGTM=r
R=r
CC=golang-codereviews
https://golang.org/cl/65650043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ac40fb44701c7a920310e18d22777196bdf8e581
元コミット内容
このコミットの目的は、api/except.txt
ファイルにpkg unicode, const Version = "6.2.0"
という行を追加することです。これは、unicode
パッケージ内のVersion
定数の値が"6.2.0"
に変更されたことを、GoのAPI互換性チェック機構が許容するようにするためのものです。コミットメッセージには「Unbreaks the build.」とあり、この変更がビルドの失敗を解消したことが示されています。
変更の背景
Go言語の標準ライブラリは、後方互換性を非常に重視しています。新しいGoのバージョンがリリースされる際、既存のコードが引き続き動作するように、APIの変更は厳しく管理されます。Goプロジェクトでは、APIの変更を検出するためのツール(go tool api
など)が存在し、これらはapi/go.txt
というファイルに記録されたAPIシグネチャと比較されます。
unicode
パッケージは、Unicode標準のバージョンに依存しています。Unicode標準は定期的に更新され、それに伴いGoのunicode
パッケージも内部的に更新されることがあります。このコミットが行われた2014年2月時点では、Unicodeのバージョンが6.2.0に更新された可能性があります。
通常、定数の値の変更はAPIの破壊的変更とはみなされませんが、GoのAPI互換性チェックツールは、このような変更も検出することがあります。特に、api/go.txt
に記録されているAPIシグネチャと実際のコードの間に不一致が生じた場合、ビルドが失敗する可能性があります。
このコミットの背景には、unicode.Version
定数の値が"6.2.0"
に更新されたことによって、Goのビルドプロセスが中断されたという問題があります。このビルド中断は、API互換性チェックツールがこの変更を「予期せぬ変更」としてフラグを立てたためと考えられます。
前提知識の解説
GoのAPI互換性
Go言語は、バージョン間の後方互換性を非常に重視しています。これは、Goのプログラムが新しいバージョンのGoコンパイラで再コンパイルされた場合でも、既存のAPIを使用している限り、変更なしで動作し続けることを意味します。この互換性を維持するために、GoプロジェクトではAPIの変更を厳密に管理しています。
GoのAPI互換性チェックは、主に以下のファイルとツールによって行われます。
api/go.txt
: このファイルには、Goの標準ライブラリの公開APIの「スナップショット」が記録されています。これは、Goの各リリースにおけるAPIの基準となります。go tool api
: このツールは、現在のGoソースコードの公開APIを抽出し、api/go.txt
の内容と比較します。もし、現在のAPIがapi/go.txt
に記録されているAPIと互換性がない場合(例えば、公開関数のシグネチャが変更された、公開フィールドが削除されたなど)、エラーが報告されます。api/except.txt
: このファイルは、go tool api
による互換性チェックにおいて、特定のAPI変更を「例外」として扱うためのホワイトリストです。通常、api/go.txt
に記録されていないAPI変更はエラーとなりますが、api/except.txt
に記述された変更は許容されます。これは、APIの破壊的変更ではないが、go tool api
が誤って破壊的変更と判断してしまうようなケースや、特定の理由で許容されるべき変更(例えば、内部的な定数の値の変更など)に対して使用されます。
Unicode標準とGoのunicode
パッケージ
Unicodeは、世界中の文字を統一的に扱うための文字コード標準です。Go言語の標準ライブラリには、Unicodeのプロパティや操作を扱うためのunicode
パッケージが含まれています。このパッケージは、特定のバージョンのUnicode標準に準拠しており、そのバージョン情報はunicode.Version
という公開定数で提供されています。
Unicode標準は定期的に新しいバージョンがリリースされ、新しい文字やプロパティが追加されます。Goのunicode
パッケージも、これらの更新に合わせて内部的にデータを更新することがあります。unicode.Version
定数の値は、unicode
パッケージがサポートするUnicode標準のバージョンを示すため、Unicode標準の更新に伴ってこの定数の値も変更されることがあります。
技術的詳細
このコミットは、GoのビルドシステムにおけるAPI互換性チェックの挙動と、api/except.txt
ファイルの役割を明確に示しています。
Goのビルドプロセスでは、go tool api
コマンドが実行され、現在のGoソースコードの公開APIが、api/go.txt
に記録されているAPIと比較されます。この比較は、Goのリリース間でAPIの破壊的変更がないことを保証するために行われます。
unicode.Version
はconst
(定数)であり、その値が変更されたとしても、通常はAPIの破壊的変更とはみなされません。しかし、go tool api
ツールは、api/go.txt
に記録されたAPIシグネチャと現在のコードの間に不一致がある場合、それをエラーとして報告するように設計されています。この場合、unicode.Version
の文字列値が"6.2.0"
に更新されたことで、api/go.txt
に記録されていた古い値との間に不一致が生じ、go tool api
がエラーを発生させ、結果としてビルドが中断されたと考えられます。
この問題を解決するために、開発者はapi/except.txt
ファイルに例外ルールを追加しました。api/except.txt
は、go tool api
が特定のAPI変更を無視し、エラーとして報告しないようにするためのホワイトリストとして機能します。
追加された行 pkg unicode, const Version = "6.2.0"
は、unicode
パッケージ内のVersion
という名前の定数が"6.2.0"
という値を持つことを、API互換性チェックの例外として明示的に許可しています。これにより、go tool api
はこの特定の変更をエラーとして扱わず、ビルドが正常に完了するようになります。
このアプローチは、APIの破壊的変更ではないが、ツールが誤ってフラグを立ててしまうようなケースにおいて、ビルドを「アンブレイク」するための標準的な手順です。これは、GoのAPI互換性保証の厳格さを維持しつつ、必要な内部変更を可能にするためのバランスの取れた方法と言えます。
コアとなるコードの変更箇所
変更はapi/except.txt
ファイルに対して行われました。
--- a/api/except.txt
+++ b/api/except.txt
@@ -318,3 +318,4 @@ pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, F_spare [3]uint32
pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, Pad_cgo_1 [4]uint8
pkg syscall (openbsd-amd64-cgo), type Timespec struct, Pad_cgo_0 [4]uint8
pkg syscall (openbsd-amd64-cgo), type Timespec struct, Sec int32
+pkg unicode, const Version = "6.2.0"
コアとなるコードの解説
追加された行 pkg unicode, const Version = "6.2.0"
は、api/except.txt
の構文に従っています。
pkg unicode
: このルールがunicode
パッケージに適用されることを示します。const Version
:unicode
パッケージ内のVersion
という名前の定数に関するルールであることを示します。= "6.2.0"
:Version
定数の期待される値が"6.2.0"
であることを示します。
この行がapi/except.txt
に追加されることで、go tool api
は、unicode.Version
定数の値が"6.2.0"
である場合、それをAPI互換性違反とはみなさなくなります。これにより、unicode
パッケージがUnicode 6.2.0に更新されたことによるビルドエラーが解消され、Goのビルドが再び成功するようになりました。
この変更は、GoのAPI互換性チェックシステムが、厳密なAPIシグネチャの比較だけでなく、特定の許容される変更をホワイトリスト化する柔軟性を持っていることを示しています。
関連リンク
- Go言語のAPI互換性に関する公式ドキュメントやブログ記事(当時のものがあれば)
go tool api
コマンドに関する情報- Goの
unicode
パッケージに関するドキュメント
参考にした情報源リンク
- Go言語の公式ドキュメント (特にAPI互換性に関するセクション)
- Goのソースコードリポジトリ内の
api/except.txt
およびapi/go.txt
ファイル - Goのコミット履歴と関連するコードレビュー(
https://golang.org/cl/65650043
) - Unicode Consortiumのウェブサイト (Unicode標準のバージョン情報)
- Go言語のビルドシステムに関する一般的な知識