Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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/benchcmpgo.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 buildgo run のような高レベルのコマンドによって内部的に呼び出されますが、go tool を使って直接実行することも可能です。また、go toolgo.tools リポジトリにある一部のツール(例: vet, cover)も実行できるように特殊なパス解決を行います。
  • benchcmp: benchcmp は、Goのベンチマーク結果を比較するためのユーティリティです。Goのベンチマークは go test -bench=. のように実行され、その結果は標準出力に出力されます。benchcmp は、異なるベンチマーク実行の結果を比較し、パフォーマンスの回帰や改善を特定するのに役立ちます。
  • go.tools (現在の golang.org/x/tools): これは、Goプロジェクトが公式にメンテナンスしているが、Goの標準ライブラリやコアツールチェーンには含まれない補助ツールやライブラリのコレクションです。これには、コード分析ツール(vetcover)、ドキュメントツール(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 がどの外部ツールを認識し、どのようにそれらを解決するかを定義するデータ構造とロジックが存在します。

具体的には、以下の点が変更の対象となります。

  1. goTools マップからのエントリ削除: src/cmd/go/pkg.go にある goTools マップは、go tool コマンドが認識する外部ツールのインポートパスと、それらがインストールされるべきターゲットディレクトリ(toTool または toBin)を定義しています。benchcmp がコアツールから分離されるため、このマップから code.google.com/p/go.tools/cmd/benchcmp のエントリが削除されます。
  2. isInGoToolsRepo 関数の修正: src/cmd/go/tool.go にある isInGoToolsRepo 関数は、特定のツール名が go.tools リポジトリに属するかどうかを判断するために使用されます。benchcmp がもはや go tool の特殊なケースとして扱われないため、この関数から benchcmp のケースが削除されます。
  3. ドキュメントの更新: doc/go1.3.txt はGo 1.3のリリースノートであり、この変更がユーザーに明確に伝わるように更新されます。

これらの変更により、go tool benchcmp を実行しようとすると、Goツールチェーンはもはやそのコマンドを認識せず、エラーを返すか、またはユーザーが go get golang.org/x/tools/cmd/benchcmp を実行して benchcmp を個別にインストールする必要があることを示唆するようになります。

コアとなるコードの変更箇所

このコミットでは、以下の3つのファイルが変更されています。

  1. 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のリリースノートを更新し、benchcmpgo tool の一部ではなくなり、go.tools リポジトリの独立したツールとして利用可能になったことを明確にしています。
  2. src/cmd/go/pkg.go:

    • goTools マップから以下の行が削除されました。
      -	"code.google.com/p/go.tools/cmd/benchcmp": toTool,
      
    • この変更により、go コマンドは code.google.com/p/go.tools/cmd/benchcmp を特別なツールとして認識しなくなります。
  3. 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
      
    • この変更により、benchcmpgo.tools リポジトリに属するが go tool コマンドによって特殊な方法で扱われるツール(covervet のように)ではなくなります。

コアとなるコードの解説

  • doc/go1.3.txt の変更: この変更は、ユーザーに対する情報提供の側面が強いです。以前は misc/benchcmpgo tool benchcmp に置き換えられたと記述されていましたが、このコミットによって go tool benchcmp 自体が削除され、go.tools/cmd/benchcmp として独立したツールになったことを明記しています。これにより、ユーザーは benchcmp を使用するために go get golang.org/x/tools/cmd/benchcmp のように明示的にインストールする必要があることを理解できます。

  • src/cmd/go/pkg.gogoTools マップの変更: goTools マップは、go コマンドがビルドおよびインストール時に特別に扱うべき外部ツールを定義しています。benchcmp のエントリを削除することで、go コマンドはもはや benchcmp をGoの標準配布物の一部として自動的にビルドまたは管理しなくなります。これは、benchcmp がGoのコアツールセットから切り離され、独立したプロジェクトとして扱われるようになったことを意味します。

  • src/cmd/go/tool.goisInGoToolsRepo 関数の変更: isInGoToolsRepo 関数は、go tool コマンドが引数として受け取ったツール名が、golang.org/x/tools リポジトリに由来する特別なツールであるかどうかを判断するために使用されます。covervet のように、これらのツールは go tool covergo tool vet のように直接実行できますが、実際には golang.org/x/tools/cmd/covergolang.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 the go run command. This flag allows users to specify the directory in which the command should be run.)
  • Go言語の公式ドキュメントおよびGoツールに関する一般的な知識。
  • golang.org/x/tools リポジトリの構造と目的に関する一般的な知識。