[インデックス 18657] ファイルの概要
コミット
commit 66562b9698ead1b8aec7af289689427d587a01bd
Author: Andrew Gerrand <adg@golang.org>
Date: Wed Feb 26 13:04:39 2014 +1100
cmd/go: remove 'go tool benchcmp' and corresponding special case
See the discussion on the original CL for context:
https://golang.org/cl/60100043/
LGTM=josharian
R=r, josharian
CC=golang-codereviews
https://golang.org/cl/68890043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/66562b9698ead1b8aec7af289689427d587a01bd
元コミット内容
cmd/go: 'go tool benchcmp' とそれに対応する特殊ケースを削除
変更の背景
このコミットは、Goツールチェーンから go tool benchcmp コマンドとその関連する特殊な処理を削除することを目的としています。コミットメッセージに記載されているように、misc/benchcmp は go.tools/cmd/benchcmp に置き換えられました。これは、benchcmp ツールがGoの標準配布物から go.tools リポジトリ(現在は golang.org/x/tools)へと移動されたことを意味します。
Goプロジェクトでは、コアツールと、より専門的または実験的なツールを分離する傾向があります。go.tools リポジトリは、Go開発者が提供する様々な補助ツールやライブラリをホストするために使用されます。benchcmp のようなベンチマーク結果を比較するツールは、すべてのGoユーザーにとって必須ではないため、コアツールチェーンから分離し、必要に応じて個別にインストールできるようにすることが適切と判断されたと考えられます。これにより、Goの配布物のサイズを削減し、コアツールの保守を簡素化することができます。
この変更は、Go 1.3のリリースノートにも反映されており、misc/benchcmp が削除され、go.tools/cmd/benchcmp に置き換えられたことが明記されています。
前提知識の解説
go toolコマンド:go toolは、Goツールチェーンに含まれる低レベルのツール(アセンブラ、リンカ、コンパイラなど)を実行するためのコマンドです。通常、これらのツールはgo buildやgo runのような高レベルのコマンドによって内部的に呼び出されますが、go toolを使って直接実行することも可能です。また、go toolはgo.toolsリポジトリにある一部のツール(例:vet,cover)も実行できるように特殊なパス解決を行います。benchcmp:benchcmpは、Goのベンチマーク結果を比較するためのユーティリティです。Goのベンチマークはgo test -bench=.のように実行され、その結果は標準出力に出力されます。benchcmpは、異なるベンチマーク実行の結果を比較し、パフォーマンスの回帰や改善を特定するのに役立ちます。go.tools(現在のgolang.org/x/tools): これは、Goプロジェクトが公式にメンテナンスしているが、Goの標準ライブラリやコアツールチェーンには含まれない補助ツールやライブラリのコレクションです。これには、コード分析ツール(vet、cover)、ドキュメントツール(godoc)、言語サーバー(gopls)などが含まれます。これらのツールは通常、go get golang.org/x/tools/cmd/toolnameのように個別にインストールされます。- CL (Change List): Goプロジェクトでは、コード変更は「Change List」(CL)として提出され、レビューされます。コミットメッセージに記載されている
https://golang.org/cl/60100043/やhttps://golang.org/cl/68890043は、これらの変更が議論され、承認されたレビュープロセスのリンクを指します。
技術的詳細
このコミットの技術的な核心は、go tool コマンドが benchcmp を内部ツールとして認識し、実行するためのメカニズムを削除することにあります。
Goの cmd/go パッケージは、go コマンドの主要なロジックを実装しています。このパッケージ内には、go tool がどの外部ツールを認識し、どのようにそれらを解決するかを定義するデータ構造とロジックが存在します。
具体的には、以下の点が変更の対象となります。
goToolsマップからのエントリ削除:src/cmd/go/pkg.goにあるgoToolsマップは、go toolコマンドが認識する外部ツールのインポートパスと、それらがインストールされるべきターゲットディレクトリ(toToolまたはtoBin)を定義しています。benchcmpがコアツールから分離されるため、このマップからcode.google.com/p/go.tools/cmd/benchcmpのエントリが削除されます。isInGoToolsRepo関数の修正:src/cmd/go/tool.goにあるisInGoToolsRepo関数は、特定のツール名がgo.toolsリポジトリに属するかどうかを判断するために使用されます。benchcmpがもはやgo toolの特殊なケースとして扱われないため、この関数からbenchcmpのケースが削除されます。- ドキュメントの更新:
doc/go1.3.txtはGo 1.3のリリースノートであり、この変更がユーザーに明確に伝わるように更新されます。
これらの変更により、go tool benchcmp を実行しようとすると、Goツールチェーンはもはやそのコマンドを認識せず、エラーを返すか、またはユーザーが go get golang.org/x/tools/cmd/benchcmp を実行して benchcmp を個別にインストールする必要があることを示唆するようになります。
コアとなるコードの変更箇所
このコミットでは、以下の3つのファイルが変更されています。
-
doc/go1.3.txt:- 変更前:
misc/benchcmp has been replaced by go tool benchcmp (CL 47980043) - 変更後:
misc/benchcmp: removed and replaced by go.tools/cmd/benchcmp (CL 47980043) - この変更は、Go 1.3のリリースノートを更新し、
benchcmpがgo toolの一部ではなくなり、go.toolsリポジトリの独立したツールとして利用可能になったことを明確にしています。
- 変更前:
-
src/cmd/go/pkg.go:goToolsマップから以下の行が削除されました。- "code.google.com/p/go.tools/cmd/benchcmp": toTool,- この変更により、
goコマンドはcode.google.com/p/go.tools/cmd/benchcmpを特別なツールとして認識しなくなります。
-
src/cmd/go/tool.go:isInGoToolsRepo関数内のswitchステートメントから"benchcmp"のケースが削除されました。--- a/src/cmd/go/tool.go +++ b/src/cmd/go/tool.go @@ -65,7 +65,7 @@ func tool(toolName string) string { func isInGoToolsRepo(toolName string) bool { switch toolName { - case "benchcmp", "cover", "vet": + case "cover", "vet": return true } return false- この変更により、
benchcmpはgo.toolsリポジトリに属するがgo toolコマンドによって特殊な方法で扱われるツール(coverやvetのように)ではなくなります。
コアとなるコードの解説
-
doc/go1.3.txtの変更: この変更は、ユーザーに対する情報提供の側面が強いです。以前はmisc/benchcmpがgo tool benchcmpに置き換えられたと記述されていましたが、このコミットによってgo tool benchcmp自体が削除され、go.tools/cmd/benchcmpとして独立したツールになったことを明記しています。これにより、ユーザーはbenchcmpを使用するためにgo get golang.org/x/tools/cmd/benchcmpのように明示的にインストールする必要があることを理解できます。 -
src/cmd/go/pkg.goのgoToolsマップの変更:goToolsマップは、goコマンドがビルドおよびインストール時に特別に扱うべき外部ツールを定義しています。benchcmpのエントリを削除することで、goコマンドはもはやbenchcmpをGoの標準配布物の一部として自動的にビルドまたは管理しなくなります。これは、benchcmpがGoのコアツールセットから切り離され、独立したプロジェクトとして扱われるようになったことを意味します。 -
src/cmd/go/tool.goのisInGoToolsRepo関数の変更:isInGoToolsRepo関数は、go toolコマンドが引数として受け取ったツール名が、golang.org/x/toolsリポジトリに由来する特別なツールであるかどうかを判断するために使用されます。coverやvetのように、これらのツールはgo tool coverやgo tool vetのように直接実行できますが、実際にはgolang.org/x/tools/cmd/coverやgolang.org/x/tools/cmd/vetとしてインストールされます。benchcmpをこのリストから削除することで、go tool benchcmpはもはや特別なパス解決の恩恵を受けず、goコマンドはbenchcmpを認識しない通常の外部コマンドとして扱います。これにより、ユーザーはbenchcmpを使用する前に、そのツールがシステムパス上にあるか、または完全なパスで指定する必要があることを意味します。
これらの変更は全体として、Goのコアツールセットをスリム化し、benchcmp のような特定の用途のツールを go.tools エコシステムに移行させるというGoプロジェクトの戦略を反映しています。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/66562b9698ead1b8aec7af289689427d587a01bd
- 元のCL (Change List) の議論:
https://golang.org/cl/60100043/(Web検索では情報が見つかりませんでした) - 関連するCL (Change List):
https://golang.org/cl/68890043(Web検索結果によると、これはgo runに-Cフラグを追加する別のコミットのようです。コミットメッセージに記載されているものの、benchcmpの削除とは直接関連しない可能性があります。)
参考にした情報源リンク
- Google Web Search for "golang cl 60100043" (No search results or information found)
- Google Web Search for "golang cl 68890043" (Web search results for "golang cl 68890043": CL 68890043, titled "cmd/go: add -C flag to 'go run'", introduces a new
-Cflag to thego runcommand. This flag allows users to specify the directory in which the command should be run.) - Go言語の公式ドキュメントおよびGoツールに関する一般的な知識。
golang.org/x/toolsリポジトリの構造と目的に関する一般的な知識。