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

[インデックス 11601] ファイルの概要

このコミットは、Go言語のツールチェインにおけるツールの参照方法を標準化することを目的としています。具体的には、gofixgovet のような個別のツール名を直接参照する代わりに、go tool fixgo tool vet のように go tool コマンドを介してツールを呼び出す形式に、ドキュメントやスクリプト内の記述を更新しています。これにより、Goのツールエコシステム全体で一貫したユーザーエクスペリエンスを提供し、ツールの発見性と利用方法を明確にしています。

コミット

commit 1f565e7d20d994909e6d7b274734a746639de504
Author: Rob Pike <r@golang.org>
Date:   Sat Feb 4 07:03:20 2012 +1100

    tools: update references to "x" to be "go tool x"
    For instance, don't talk about gofix, talk about the
    fix tool or "go tool fix".
    
    R=golang-dev, rsc, r
    CC=golang-dev
    https://golang.org/cl/5608053
---
 src/cmd/cgo/doc.go               |  2 +--
 src/cmd/go/doc.go                | 12 ++++++------
 src/cmd/go/fix.go                |  2 +--
 src/cmd/go/get.go                |  2 +--
 src/cmd/go/vet.go                |  4 ++--
 src/cmd/gofmt/test.sh            |  2 +--
 src/cmd/prof/doc.go              |  3 +--
 src/pkg/exp/ebnflint/doc.go      |  2 +--
 src/pkg/exp/ebnflint/ebnflint.go |  2 +--
 9 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index 6282c0bbfa..1d64c75ada 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -6,7 +6,7 @@
 
 Cgo enables the creation of Go packages that call C code.
 
-Usage: cgo [compiler options] file.go
+Usage: go tool cgo [compiler options] file.go
 
 The compiler options are passed through uninterpreted when
 invoking gcc to compile the C parts of the package.
diff --git a/src/cmd/go/doc.go b/src/cmd/go/doc.go
index 55eb4f7275..e2df7beb1c 100644
--- a/src/cmd/go/doc.go
+++ b/src/cmd/go/doc.go
@@ -12,7 +12,7 @@ The commands are:
     build       compile packages and dependencies
     clean       remove object files
     doc         run godoc on package sources
-    fix         run gofix on packages
+    fix         run go tool fix on packages
     fmt         run gofmt on package sources
     get         download and install packages and dependencies
     install     compile and install packages and dependencies
@@ -21,7 +21,7 @@ The commands are:
     test        test packages
     tool        run specified go tool
     version     print Go version
-    vet         run govet on packages
+    vet         run go tool vet on packages
 
 Use "go help [command]" for more information about a command.
 
@@ -128,7 +128,7 @@ To run godoc with specific options, run godoc itself.
 See also: go fix, go fmt, go vet.
 
 
-Run gofix on packages
+Run go tool fix on packages
 
 Usage:
 
@@ -176,7 +176,7 @@ and 'go install'.  See 'go help install'.
 The -d flag instructs get to stop after downloading the packages; that is,
 it instructs get not to install the packages.
 
-The -fix flag instructs get to run gofix on the downloaded packages
+The -fix flag instructs get to run the fix tool on the downloaded packages
 before resolving dependencies or building the code.
 
 The -u flag instructs get to use the network to update the named packages
@@ -350,7 +350,7 @@ Usage:
 Version prints the Go version, as reported by runtime.Version.\n
 
 
-Run govet on packages
+Run go tool vet on packages
 
 Usage:
 
@@ -361,7 +361,7 @@ Vet runs the Go vet command on the packages named by the import paths.
 For more about vet, see 'godoc vet'.
 For more about import paths, see 'go help importpath'.
 
-To run govet with specific options, run 'go tool vet'.
+To run the vet tool with specific options, run 'go tool vet'.
 
 See also: go fmt, go fix.
 
diff --git a/src/cmd/go/fix.go b/src/cmd/go/fix.go
index 19091f35bf..6a0ad0774c 100644
--- a/src/cmd/go/fix.go
+++ b/src/cmd/go/fix.go
@@ -7,7 +7,7 @@ package main
 var cmdFix = &Command{
 	Run:       runFix,
 	UsageLine: "fix [importpath...]",
-\tShort:     "run gofix on packages",
+\tShort:     "run go tool fix on packages",
 	Long: `
 Fix runs the Go fix command on the packages named by the import paths.
 
diff --git a/src/cmd/go/get.go b/src/cmd/go/get.go
index f9f8542393..e66810cb3f 100644
--- a/src/cmd/go/get.go
+++ b/src/cmd/go/get.go
@@ -29,7 +29,7 @@ and 'go install'.  See 'go help install'.
 The -d flag instructs get to stop after downloading the packages; that is,
 it instructs get not to install the packages.
 
-The -fix flag instructs get to run gofix on the downloaded packages
+The -fix flag instructs get to run the fix tool on the downloaded packages
 before resolving dependencies or building the code.
 
 The -u flag instructs get to use the network to update the named packages
diff --git a/src/cmd/go/vet.go b/src/cmd/go/vet.go
index 6609ac8ef0..51dcec2bef 100644
--- a/src/cmd/go/vet.go
+++ b/src/cmd/go/vet.go
@@ -7,14 +7,14 @@ package main
 var cmdVet = &Command{
 	Run:       runVet,
 	UsageLine: "vet [importpath...]",
-\tShort:     "run govet on packages",
+\tShort:     "run go tool vet on packages",
 	Long: `
 Vet runs the Go vet command on the packages named by the import paths.
 
 For more about vet, see 'godoc vet'.
 For more about import paths, see 'go help importpath'.
 
-To run govet with specific options, run 'go tool vet'.
+To run the vet tool with specific options, run 'go tool vet'.
 
 See also: go fmt, go fix.
 	`,
diff --git a/src/cmd/gofmt/test.sh b/src/cmd/gofmt/test.sh
index c18987f4d1..65601b1013 100755
--- a/src/cmd/gofmt/test.sh
+++ b/src/cmd/gofmt/test.sh
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
-eval $(gomake --no-print-directory -f ../../Make.inc go-env)\n
+eval $(go tool make --no-print-directory -f ../../Make.inc go-env)\n
 if [ -z "$O" ]; then
 \techo 'missing $O - maybe no Make.$GOARCH?' 1>&2
 \texit 1
diff --git a/src/cmd/prof/doc.go b/src/cmd/prof/doc.go
index 1f2209f04b..08aa086291 100644
--- a/src/cmd/prof/doc.go
+++ b/src/cmd/prof/doc.go
@@ -41,8 +41,7 @@ Flag -t sets the maximum real time to sample, in seconds, and -d
 sets the sampling interval in milliseconds.  The default is to sample
 every 100ms until the program completes.\n
 
-For reasons of disambiguation it is installed as 6prof although it also serves
-as an 8prof and a 5prof.\n
+It is installed as go tool prof and is architecture-independent.\n
 
 */
 package documentation
diff --git a/src/pkg/exp/ebnflint/doc.go b/src/pkg/exp/ebnflint/doc.go
index 408227f71e..4bb22a4cb8 100644
--- a/src/pkg/exp/ebnflint/doc.go
+++ b/src/pkg/exp/ebnflint/doc.go
@@ -13,7 +13,7 @@ Grammar productions are grouped in boxes demarcated by the HTML elements
 
 
 Usage:\n
-\tebnflint [--start production] [file]\n
+\tgo tool ebnflint [--start production] [file]\n
 
 The --start flag specifies the name of the start production for
 the grammar; it defaults to "Start".
diff --git a/src/pkg/exp/ebnflint/ebnflint.go b/src/pkg/exp/ebnflint/ebnflint.go
index 2cb5aa6ed6..d54fb229d0 100644
--- a/src/pkg/exp/ebnflint/ebnflint.go
+++ b/src/pkg/exp/ebnflint/ebnflint.go
@@ -21,7 +21,7 @@ var fset = token.NewFileSet()\n var start = flag.String("start", "Start", "name of start production")\n 
 func usage() {\n
-\tfmt.Fprintf(os.Stderr, "usage: ebnflint [flags] [filename]\\n")\n
+\tfmt.Fprintf(os.Stderr, "usage: go tool ebnflint [flags] [filename]\\n")\n
 \tflag.PrintDefaults()\n
 \tos.Exit(1)\n
 }\n

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/1f565e7d20d994909e6d7b274734a746639de504

元コミット内容

tools: update references to "x" to be "go tool x"
For instance, don't talk about gofix, talk about the
fix tool or "go tool fix".

変更の背景

このコミットは、Go言語がバージョン1.0のリリース(2012年3月)に向けて準備を進めていた時期に行われました。Go 1.0は、言語とツールチェインの安定化を目指す重要なマイルストーンであり、その一環として、ユーザーがGoの様々な補助ツール(例: コードフォーマッタ、静的解析ツール、プロファイラなど)をどのように利用すべきかについて、一貫性のある明確なガイドラインを確立する必要がありました。

以前は、gofixgovet のように、各ツールが独立したコマンドとして存在し、それぞれが独自の実行パスを持っていました。しかし、Goエコシステムが成長し、より多くのツールが開発されるにつれて、これらのツールを統一されたインターフェースで管理し、ユーザーが簡単に発見・実行できるようにすることが重要になりました。

go tool コマンドの導入と、それに伴う既存ツールの参照方法の変更は、以下の目的を達成するために行われました。

  1. 一貫性の向上: すべてのGo関連ツールを go tool <toolname> の形式で実行できるようにすることで、ユーザーはGoのツールチェイン全体で統一された操作感を体験できます。
  2. 発見性の向上: go tool コマンドを実行するだけで、利用可能なすべての内部ツールを一覧表示できるようになり、ユーザーはGoが提供する隠れたユーティリティを容易に発見できるようになります。
  3. 名前空間の衝突回避: gofix のようなグローバルなコマンド名が、将来的に他のシステムコマンドやユーザー定義のスクリプトと衝突する可能性を低減します。go tool の下にツールをネストすることで、GoのツールはGoエコシステム内の名前空間に限定されます。
  4. ドキュメントの明確化: ドキュメントやヘルプメッセージでツールの正しい呼び出し方を明示することで、ユーザーの混乱を防ぎ、学習コストを削減します。

このコミットは、Go言語のツールチェインが成熟し、より洗練されたユーザーエクスペリエンスを提供するための初期段階の重要なステップでした。

前提知識の解説

Go言語のツールチェインと go コマンド

Go言語は、コンパイラ、リンカ、フォーマッタ、テストランナーなど、開発に必要な多くのツールを統合した強力なコマンドラインツール go を提供しています。この go コマンドは、Goプロジェクトのビルド、テスト、依存関係管理、コードフォーマットなど、開発ワークフローのほぼすべてをカバーします。

go tool コマンド

go tool は、go コマンドの一部として提供されるサブコマンドです。その主な目的は、Go言語の標準配布に含まれる、より専門的または内部的なツールへのアクセスを提供することです。これらのツールは、通常、開発者が直接頻繁に呼び出すものではなく、特定のタスク(例: プロファイリングデータの解析、コードの静的解析、C言語との連携など)のために使用されます。

go tool を介してツールを実行する利点は以下の通りです。

  • 統一されたインターフェース: すべてのGo関連ツールが go コマンドの下に統合され、一貫した呼び出し方法を提供します。
  • パス設定の不要: これらのツールはGoのインストールパス内に存在するため、ユーザーが個別に環境変数 PATH を設定する必要がありません。
  • バージョン管理: go コマンドが管理するGoのバージョンに紐づいているため、使用しているGoのバージョンに対応するツールが自動的に選択されます。

主要なGoツール(変更対象となったもの)

  • cgo: GoコードからC言語のコードを呼び出すためのツール。C言語のライブラリとGoプログラムを連携させる際に使用されます。
  • gofix (または fix ツール): Go言語のバージョンアップに伴うAPIの変更や非推奨化に対応するため、古いGoコードを自動的に新しいGoの構文やAPIに修正するツール。Go 1.0リリース時に特に重要でした。
  • gofmt (または fmt ツール): Goコードを標準的なスタイルに自動的にフォーマットするツール。Goコミュニティ全体で一貫したコードスタイルを維持するために広く使用されています。
  • govet (または vet ツール): Goコードの静的解析ツール。潜在的なバグや疑わしいコード構造(例: フォーマット文字列の不一致、到達不能なコードなど)を検出します。
  • prof (または go tool pprof): Goプログラムのプロファイリングデータを解析し、CPU使用率、メモリ割り当てなどのパフォーマンス情報を視覚化するためのツール。
  • ebnflint: Go言語の実験的なパッケージ exp/ebnflint に含まれるツールで、EBNF(拡張バッカス・ナウア記法)形式の文法定義を解析・検証するために使用されます。

技術的詳細

このコミットの技術的本質は、Go言語のツールチェインにおけるコマンドディスパッチとドキュメンテーションの整合性に関するものです。

Goの go コマンドは、内部的に様々なサブコマンド(build, test, fmt など)と、さらにその下にある「ツール」を管理しています。go tool コマンドは、これらの内部ツールへのゲートウェイとして機能します。ユーザーが go tool <toolname> を実行すると、go コマンドは指定された <toolname> に対応するバイナリ(通常は $GOROOT/pkg/tool/$GOOS_$GOARCH/ ディレクトリに配置されている)を探し、そのバイナリを実行します。

この変更は、主に以下の2つの側面で技術的な影響を与えます。

  1. ドキュメンテーションの正確性: ユーザーがGoのツールを正しく呼び出せるように、すべての公式ドキュメント、ヘルプメッセージ、およびコード例で、ツールの参照方法を go tool <toolname> の形式に統一します。これにより、ユーザーは常に推奨される方法でツールを使用するよう誘導されます。
  2. スクリプトの堅牢性: ビルドスクリプトやテストスクリプト(例: src/cmd/gofmt/test.sh)内でツールを呼び出す際も、go tool <toolname> の形式を使用するように変更します。これにより、スクリプトがGoのツールチェインの標準的な呼び出し規約に準拠し、将来的なGoのバージョンアップや環境設定の変更に対してより堅牢になります。例えば、gomake のような内部的なビルドヘルパーも go tool make を介して呼び出すように変更されています。

この変更は、Goのツールチェインの内部構造そのものを大きく変えるものではなく、むしろその「外部インターフェース」(ユーザーや他のスクリプトからの呼び出し方)と、そのインターフェースに関する「説明」(ドキュメント)を標準化するものです。これは、大規模なソフトウェアプロジェクトにおいて、一貫性と保守性を確保するための一般的なプラクティスです。特に、Go 1.0という安定版リリースを控えていた時期において、このような細部の統一は、長期的なプロジェクトの健全性を保つ上で非常に重要でした。

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

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

  • src/cmd/cgo/doc.go: cgo ツールのドキュメント。
  • src/cmd/go/doc.go: go コマンド全体のドキュメント。fixvet などのサブコマンドの説明が含まれます。
  • src/cmd/go/fix.go: go fix コマンドの実装に関連するファイル。Short 説明が変更されています。
  • src/cmd/go/get.go: go get コマンドの実装に関連するファイル。-fix フラグの説明が変更されています。
  • src/cmd/go/vet.go: go vet コマンドの実装に関連するファイル。Short 説明と詳細な説明が変更されています。
  • src/cmd/gofmt/test.sh: gofmt ツールのテストスクリプト。gomake の呼び出し方が変更されています。
  • src/cmd/prof/doc.go: prof ツールのドキュメント。
  • src/pkg/exp/ebnflint/doc.go: 実験的な ebnflint ツールのドキュメント。
  • src/pkg/exp/ebnflint/ebnflint.go: ebnflint ツールの実装。usage メッセージが変更されています。

これらの変更は、主に文字列の置換であり、"x""go tool x" に、または gofixgo tool fix に変更しています。

コアとなるコードの解説

変更された各ファイルは、Goのツールチェインにおけるドキュメント、ヘルプメッセージ、または内部スクリプトの一部です。

ドキュメントファイル (doc.go ファイル群)

これらのファイルは、Goのコマンドやツールの使い方を説明するドキュメンテーションコメントを含んでいます。例えば、src/cmd/cgo/doc.go では、cgo の使用法が以下のように変更されています。

--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -6,7 +6,7 @@
 
 Cgo enables the creation of Go packages that call C code.
 
-Usage: cgo [compiler options] file.go
+Usage: go tool cgo [compiler options] file.go

これは、ユーザーに対して cgo を直接実行するのではなく、go tool cgo を介して実行することを推奨する明確な指示です。同様の変更が src/cmd/go/doc.gosrc/cmd/prof/doc.gosrc/pkg/exp/ebnflint/doc.go にも適用されています。特に src/cmd/go/doc.go は、go fixgo vet といった主要なサブコマンドのヘルプメッセージを更新しており、これらのコマンドが内部的に go tool fixgo tool vet を実行することを示唆しています。

コマンド定義ファイル (fix.go, get.go, vet.go)

これらのファイルは、go コマンドのサブコマンドの定義を含んでいます。例えば、src/cmd/go/fix.go では、cmdFix という構造体の Short フィールド(コマンドの短い説明)が更新されています。

--- a/src/cmd/go/fix.go
+++ b/src/cmd/go/fix.go
@@ -7,7 +7,7 @@ package main
 var cmdFix = &Command{
 	Run:       runFix,
 	UsageLine: "fix [importpath...]",
-\tShort:     "run gofix on packages",
+\tShort:     "run go tool fix on packages",
 	Long: `
 Fix runs the Go fix command on the packages named by the import paths.

これは、go fix コマンドが実際には go tool fix を実行する、というより正確な表現に修正されたことを示しています。src/cmd/go/get.go-fix フラグの説明や、src/cmd/go/vet.goShort および Long 説明も同様に更新されています。

シェルスクリプト (test.sh)

src/cmd/gofmt/test.sh のようなシェルスクリプトでは、内部的なビルドヘルパーである gomake の呼び出し方が変更されています。

--- a/src/cmd/gofmt/test.sh
+++ b/src/cmd/gofmt/test.sh
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
-eval $(gomake --no-print-directory -f ../../Make.inc go-env)\n
+eval $(go tool make --no-print-directory -f ../../Make.inc go-env)\n
 if [ -z "$O" ]; then
 \techo 'missing $O - maybe no Make.$GOARCH?' 1>&2
 \texit 1

これは、Goの内部ツールやヘルパーも go tool の下に統合されるという方針を反映しており、スクリプトがGoのツールチェインの標準的な呼び出し規約に準拠するようにしています。

これらの変更は、Goのツールチェインのユーザーインターフェースと内部的な整合性を高めるための、細部にわたる配慮を示しています。

関連リンク

  • Go言語公式ドキュメント: https://go.dev/doc/
  • go コマンドのドキュメント: https://go.dev/cmd/go/
  • go tool コマンドのドキュメント: go tool コマンド自体には専用のオンラインドキュメントは少ないですが、go help tool で利用可能なツールの一覧と簡単な説明が表示されます。

参考にした情報源リンク

  • GitHub上のコミットページ: https://github.com/golang/go/commit/1f565e7d20d994909e6d7b274734a746639de504
  • Go 1.0 リリースに関する情報 (Web検索結果より):
    • Go 1.0のリリース日と主要な変更点に関する情報源 (例: Wikipedia, bytesizego.com, educative.io)
    • go fixgo vet といったツールの歴史的背景に関する情報源 (例: medium.com, go.dev)