[インデックス 14017] ファイルの概要
このコミットは、Go言語のソースコードリポジトリにおけるsrc/run.bat
ファイルの変更を記録しています。具体的には、go tool api
コマンドに新しいフラグ-except
が追加されたことを示しています。
コミット
src/run.bat: add new flag for api tool Fixes build. Makes me annoyed.
R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/6591074
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dfa139aaa0ec9bfb2b23a66a315a88f757fdbea7
元コミット内容
commit dfa139aaa0ec9bfb2b23a66a315a88f757fdbea7
Author: Rob Pike <r@golang.org>
Date: Thu Oct 4 11:49:33 2012 +1000
src/run.bat: add new flag for api tool
Fixes build.
Makes me annoyed.
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/6591074
変更の背景
このコミットの背景には、Go言語のビルドプロセスにおけるAPI互換性チェックの問題があったと考えられます。コミットメッセージの「Fixes build.」と「Makes me annoyed.」という記述から、go tool api
コマンドが何らかの理由でビルドを妨げており、その問題を解決するためにこの変更が導入されたことが示唆されます。
Go言語では、後方互換性を非常に重視しており、新しいバージョンで既存のAPIが変更されることは厳しく管理されています。go tool api
は、このAPI互換性をチェックするためのツールです。しかし、開発中のコードベースでは、一時的にAPIの変更が発生したり、特定の変更が意図的に許可されたりする場合があります。このような状況で、go tool api
がエラーを発生させ、ビルドが中断されることがあったと推測されます。
-except
フラグの追加は、特定のAPI変更を一時的に無視することで、ビルドを続行できるようにするための緊急的な対応であった可能性が高いです。「Makes me annoyed.」という表現は、開発者がこの問題に直面し、迅速な解決策が必要であったことを示しています。
前提知識の解説
go tool api
go tool api
は、Go言語の標準ツールチェーンに含まれるコマンドの一つで、GoのAPIの互換性をチェックするために使用されます。Go言語のバージョンアップにおいて、既存のプログラムが新しいGoバージョンでも問題なく動作するように、APIの変更は厳しく管理されています。このツールは、Goの標準ライブラリや公開APIが、以前のバージョンと比較して互換性のない変更が加えられていないかを検証します。
主な用途は以下の通りです。
- 後方互換性の維持: Go言語の重要な設計原則の一つは、後方互換性を維持することです。
go tool api
は、新しいGoバージョンがリリースされる際に、既存のコードが壊れないことを保証するために使われます。 - APIの変更管理: 開発者がGoの標準ライブラリに新しい機能を追加したり、既存の機能を変更したりする際に、意図しないAPIの変更が発生しないかを確認します。
go1.txt
とnext.txt
: 通常、このツールは2つのAPI定義ファイル(go1.txt
やnext.txt
など)を比較します。go1.txt
は安定版のAPI定義を、next.txt
は開発中のAPI定義を表すことが多いです。
run.bat
run.bat
は、Windows環境で実行されるバッチファイルです。Go言語のプロジェクトにおいて、このようなファイルは通常、ビルド、テスト、リンティング、その他の開発タスクを自動化するために使用されます。Unix系システムにおけるMakefile
やシェルスクリプトに相当します。
このファイルは、Goのソースコードをコンパイルし、テストを実行し、API互換性チェックのような追加の検証ステップを実行する一連のコマンドを含んでいます。
API互換性チェックの重要性
Go言語では、APIの安定性が非常に重視されています。これは、Goで書かれたアプリケーションが、Goの新しいバージョンにアップグレードされた際にも、再コンパイルするだけで動作し続けることを保証するためです。APIの互換性が損なわれると、多くの既存プロジェクトが影響を受け、アップグレードが困難になります。go tool api
のようなツールは、この互換性を自動的に検証し、開発者が意図しない破壊的変更を導入するのを防ぐ役割を担っています。
技術的詳細
このコミットは、src/run.bat
ファイル内のgo tool api
コマンドの呼び出しに、-except ..\api\except.txt
という新しい引数を追加しています。
変更前:
go tool api -c ..\api\go1.txt -next ..\api\next.txt
変更後:
go tool api -c ..\api\go1.txt -next ..\api\next.txt -except ..\api\except.txt
go tool api
のフラグ
-c <file>
: 比較の基準となるAPI定義ファイルを指定します。この場合、..\api\go1.txt
はGo 1の安定したAPI定義を指していると考えられます。-next <file>
: 比較対象となる新しいAPI定義ファイルを指定します。..\api\next.txt
は、現在開発中のGoバージョンのAPI定義を指します。-except <file>
: このフラグは、go tool api
がAPI互換性チェックを行う際に、特定の変更を例外として扱うためのファイルパスを指定します。..\api\except.txt
ファイルには、無視すべきAPIの変更(例えば、特定の関数の削除やシグネチャの変更など)がリストされていると推測されます。
-except
フラグの役割
-except
フラグの導入は、go tool api
が報告する互換性エラーの一部を意図的に抑制することを可能にします。これは、以下のようなシナリオで有用です。
- 意図的な破壊的変更: ごく稀に、Goのコア開発チームが、特定のAPIに対して後方互換性のない変更を意図的に行う場合があります。このような場合、
except.txt
にその変更を記述することで、go tool api
がエラーを報告しないようにできます。 - 一時的な開発中の変更: 開発ブランチでは、APIが頻繁に変更されることがあります。これらの変更が最終的に安定版にマージされる前に、一時的にビルドを通過させるために
-except
を使用することがあります。 - 特定の環境での差異: 特定のプラットフォームやビルド設定において、APIの振る舞いに微細な差異が生じ、それが
go tool api
によってエラーとして検出される場合があります。これを抑制するためにも使用されることがあります。
except.txt
ファイルは、通常、APIの変更内容を記述する特定のフォーマットに従っています。例えば、削除された関数名や変更されたメソッドシグネチャなどが記述されるでしょう。これにより、go tool api
は、そのファイルにリストされた変更については警告やエラーを出さずに、他の互換性のない変更のみを報告するようになります。
この変更は、ビルドプロセスをより柔軟にし、開発者がAPIの互換性に関する厳格なルールを一時的に緩和できるようにすることで、開発の効率を向上させることを目的としています。
コアとなるコードの変更箇所
diff --git a/src/run.bat b/src/run.bat
index ea87d3d806..67762e1df0 100644
--- a/src/run.bat
+++ b/src/run.bat
@@ -97,7 +97,7 @@ echo.
if %FAIL%==1 goto fail
echo # Checking API compatibility.
-go tool api -c ..\api\go1.txt -next ..\api\next.txt
+go tool api -c ..\api\go1.txt -next ..\api\next.txt -except ..\api\except.txt
if errorlevel 1 goto fail
echo.
コアとなるコードの解説
上記の差分は、src/run.bat
ファイル内の97行目付近の変更を示しています。
-
で始まる行は削除された行、+
で始まる行は追加された行です。- 変更前は、
go tool api
コマンドが-c ..\api\go1.txt -next ..\api\next.txt
という引数で実行されていました。これは、Go 1のAPI定義(go1.txt
)と、次のバージョンのAPI定義(next.txt
)を比較し、互換性のない変更がないかをチェックするものです。 - 変更後、このコマンドに
-except ..\api\except.txt
という新しい引数が追加されました。これにより、go tool api
は、except.txt
ファイルに記述されたAPIの変更については、互換性エラーとして報告しないようになります。
この変更は、ビルドスクリプトの一部としてAPI互換性チェックが実行される際に、特定のAPI変更を許容するためのメカニズムを導入したことを意味します。これにより、開発者は一時的にAPIの互換性チェックを緩和し、ビルドを成功させることが可能になります。これは、特に開発の初期段階や、特定のAPI変更が意図的である場合に有用です。
関連リンク
- Go Change List (CL): https://golang.org/cl/6591074
参考にした情報源リンク
- Go言語の公式ドキュメント(
go tool api
に関する情報) - Go言語のソースコードリポジトリ(
src/cmd/go/internal/tool/api.go
など、go tool api
の実装に関する情報) - Go言語のIssueトラッカーやメーリングリスト(API互換性に関する議論や問題報告)