[インデックス 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
-C
flag to thego run
command. This flag allows users to specify the directory in which the command should be run.) - Go言語の公式ドキュメントおよびGoツールに関する一般的な知識。
golang.org/x/tools
リポジトリの構造と目的に関する一般的な知識。