[インデックス 11601] ファイルの概要
このコミットは、Go言語のツールチェインにおけるツールの参照方法を標準化することを目的としています。具体的には、gofix
や govet
のような個別のツール名を直接参照する代わりに、go tool fix
や go 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の様々な補助ツール(例: コードフォーマッタ、静的解析ツール、プロファイラなど)をどのように利用すべきかについて、一貫性のある明確なガイドラインを確立する必要がありました。
以前は、gofix
や govet
のように、各ツールが独立したコマンドとして存在し、それぞれが独自の実行パスを持っていました。しかし、Goエコシステムが成長し、より多くのツールが開発されるにつれて、これらのツールを統一されたインターフェースで管理し、ユーザーが簡単に発見・実行できるようにすることが重要になりました。
go tool
コマンドの導入と、それに伴う既存ツールの参照方法の変更は、以下の目的を達成するために行われました。
- 一貫性の向上: すべてのGo関連ツールを
go tool <toolname>
の形式で実行できるようにすることで、ユーザーはGoのツールチェイン全体で統一された操作感を体験できます。 - 発見性の向上:
go tool
コマンドを実行するだけで、利用可能なすべての内部ツールを一覧表示できるようになり、ユーザーはGoが提供する隠れたユーティリティを容易に発見できるようになります。 - 名前空間の衝突回避:
gofix
のようなグローバルなコマンド名が、将来的に他のシステムコマンドやユーザー定義のスクリプトと衝突する可能性を低減します。go tool
の下にツールをネストすることで、GoのツールはGoエコシステム内の名前空間に限定されます。 - ドキュメントの明確化: ドキュメントやヘルプメッセージでツールの正しい呼び出し方を明示することで、ユーザーの混乱を防ぎ、学習コストを削減します。
このコミットは、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つの側面で技術的な影響を与えます。
- ドキュメンテーションの正確性: ユーザーがGoのツールを正しく呼び出せるように、すべての公式ドキュメント、ヘルプメッセージ、およびコード例で、ツールの参照方法を
go tool <toolname>
の形式に統一します。これにより、ユーザーは常に推奨される方法でツールを使用するよう誘導されます。 - スクリプトの堅牢性: ビルドスクリプトやテストスクリプト(例:
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
コマンド全体のドキュメント。fix
、vet
などのサブコマンドの説明が含まれます。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"
に、または gofix
を go 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.go
、src/cmd/prof/doc.go
、src/pkg/exp/ebnflint/doc.go
にも適用されています。特に src/cmd/go/doc.go
は、go fix
や go vet
といった主要なサブコマンドのヘルプメッセージを更新しており、これらのコマンドが内部的に go tool fix
や go 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.go
の Short
および 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 fix
やgo vet
といったツールの歴史的背景に関する情報源 (例: medium.com, go.dev)