[インデックス 11069] ファイルの概要
このコミットは、Go言語のコマンドラインツール go において、build および install サブコマンドに -v (verbose) フラグを追加するものです。このフラグが指定されると、ビルドまたはインストール中に処理されているパッケージの名前が標準エラー出力に表示されるようになります。これにより、特に大規模なプロジェクトのビルド時に、現在どのパッケージが処理されているのかが視覚的に分かりやすくなり、ビルドが「サイレント」に停止しているかのような印象を与えることを防ぎます。また、Goのビルドスクリプトである make.bash および run.bash でもこの -v フラグが利用されるようになり、Goコードのコンパイル中の進行状況がより明確に表示されるようになりました。
コミット
commit 146a703cd1ecf096d270873090c8eeef6438b5f7
Author: Russ Cox <rsc@golang.org>
Date: Mon Jan 9 16:44:01 2012 -0800
cmd/go: add -v flag to build and install
The -v flag prints the names of packages as they are built/installed.
Use -v in make.bash/run.bash to avoid a silent pause during
the build while Go code is being compiled.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5532055
---
src/cmd/go/build.go | 20 +++++++++++++++-----\
src/cmd/go/run.go | 2 +-\
src/cmd/go/test.go | 2 +-\
src/make.bash | 2 +-\
src/run.bash | 2 +-\
5 files changed, 19 insertions(+), 9 deletions(-)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/146a703cd1ecf096d270873090c8eeef6438b5f7
元コミット内容
cmd/go: add -v flag to build and install
The -v flag prints the names of packages as they are built/installed.
Use -v in make.bash/run.bash to avoid a silent pause during
the build while Go code is being compiled.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5532055
変更の背景
この変更の主な背景は、Goのビルドプロセスにおけるユーザーエクスペリエンスの向上です。以前の go build や go install コマンドは、特に多数のパッケージをビルドする際に、コンパイルの進行状況をほとんど表示しませんでした。これにより、ユーザーはコマンドがフリーズしているのか、それとも単に時間がかかっているだけなのかを判断するのが困難でした。コミットメッセージにある「silent pause (サイレントな一時停止)」という表現は、この問題点を明確に示しています。
開発者は、ビルド中にどのパッケージが処理されているかを視覚的にフィードバックすることで、ユーザーがプロセスの進行状況を把握しやすくし、不安を軽減することを目的としました。また、GoのソースコードからGoツールチェイン自体をビルドする際に使用される make.bash や run.bash スクリプトでもこの冗長な出力が利用されることで、ツールチェインのビルドプロセスもより透過的になりました。
前提知識の解説
このコミットを理解するためには、以下のGo言語および関連ツールの基本的な知識が必要です。
go build: Goのソースコードをコンパイルして実行可能ファイルやパッケージを生成するコマンドです。通常、現在のディレクトリのパッケージをビルドします。go install:go buildと似ていますが、コンパイルされたパッケージや実行可能ファイルを$GOPATH/pkgや$GOPATH/bin(または$GOBIN) にインストールする点が異なります。これにより、他のプロジェクトからそのパッケージをインポートしたり、コマンドとして実行したりできるようになります。go test: Goのテストを実行するコマンドです。go run: Goのソースファイルをコンパイルし、すぐに実行するコマンドです。一時的な実行可能ファイルを生成し、実行後に削除します。-v(verbose) フラグ: 多くのコマンドラインツールで一般的に使用されるフラグで、「詳細な出力」を意味します。通常、このフラグが指定されると、コマンドは通常の出力に加えて、より多くの情報(進行状況、デバッグ情報など)を表示します。make.bash/run.bash: Go言語の公式リポジトリに含まれるシェルスクリプトで、Goツールチェイン自体をソースコードからビルドするために使用されます。make.bashはGoの初期ビルドや再ビルドを行い、run.bashはビルドされたツールチェインを使ってテストを実行したり、特定のコマンドを実行したりします。- パッケージ (Package): Go言語におけるコードの組織単位です。関連するGoソースファイルがまとめられ、インポートパスによって識別されます。
builder構造体:cmd/goパッケージ内でビルドプロセスを管理するための内部的な構造体です。ビルドのオプション(-a,-n,-xなど)や状態を保持します。
技術的詳細
このコミットは、go build および go install コマンドに -v フラグのサポートを追加するために、主に以下の変更を行っています。
-
フラグの定義と解析:
src/cmd/go/build.go内のcmdBuildおよびcmdInstallコマンドのUsageLineに-vフラグが追加され、ヘルプメッセージにもその説明が追加されました。buildVおよびinstallVという新しいbool型の変数が定義され、それぞれcmdBuild.Flag.Bool("v", false, "")およびcmdInstall.Flag.Bool("v", false, "")を使って-vフラグの値を格納するように設定されました。
-
builder構造体の変更:src/cmd/go/build.go内のbuilder構造体にvflag boolという新しいフィールドが追加されました。これは、ビルドが冗長モードで実行されているかどうかを示すブール値です。builder構造体のinitメソッドのシグネチャが変更され、vflagパラメータを受け取るようになりました (func (b *builder) init(aflag, nflag, vflag, xflag bool)).runBuildおよびrunInstall関数内でbuilder.initを呼び出す際に、新しく定義された*buildVおよび*installVの値がinitメソッドに渡されるようになりました。
-
冗長出力の実装:
src/cmd/go/build.go内のbuilder.buildメソッドに、b.vflagがtrueの場合にパッケージのインポートパスを標準エラー出力 (os.Stderr) に出力するロジックが追加されました。
ここでif b.vflag { fmt.Fprintf(os.Stderr, "%s\n", a.p.ImportPath) }a.p.ImportPathは現在ビルドされているパッケージのインポートパスを指します。
-
go runおよびgo testの調整:src/cmd/go/run.goおよびsrc/cmd/go/test.goでは、builder.initを呼び出す際に、-vフラグに相当する引数としてfalseが明示的に渡されるようになりました。これは、go runやgo test自体はパッケージのビルド進行状況を詳細に表示する必要がないためです。これらのコマンドは内部的にgo buildのロジックを利用しますが、ユーザーへの出力はそれぞれのコマンドの目的に特化しています。
-
ビルドスクリプトの更新:
src/make.bashおよびsrc/run.bashスクリプト内で、go install -a stdコマンドがgo install -a -v stdに変更されました。これにより、Goツールチェイン自体のビルド時に、標準ライブラリの各パッケージがビルドされる際にその名前が表示されるようになり、ビルドの進行状況がより分かりやすくなりました。
この変更は、Goのビルドシステムがどのようにコマンドラインフラグを解析し、内部的なビルドロジックにその情報を伝達し、最終的にユーザーへの出力を制御しているかを示す良い例です。特に、builder 構造体を通じてビルドオプションが管理され、build メソッド内で実際の出力ロジックが実行されるというパターンは、Goツールの設計における一般的なアプローチです。
コアとなるコードの変更箇所
このコミットで変更された主要なファイルと、その変更の概要は以下の通りです。
src/cmd/go/build.go:cmdBuildとcmdInstallのUsageLineに-vフラグを追加。buildVとinstallVという新しいブール型フラグ変数を定義。runBuildとrunInstall関数内でbuilder.initの呼び出しに*buildV/*installVを追加。builder構造体にvflag boolフィールドを追加。builder.initメソッドのシグネチャにvflagパラメータを追加し、その値をb.vflagに設定。builder.buildメソッド内でb.vflagがtrueの場合にa.p.ImportPathをos.Stderrに出力するロジックを追加。
src/cmd/go/run.go:runRun関数内でbuilder.initの呼び出しにfalseを追加(-vフラグの引数として)。
src/cmd/go/test.go:runTest関数内でbuilder.initの呼び出しにfalseを追加(-vフラグの引数として)。
src/make.bash:go install -a stdをgo install -a -v stdに変更。
src/run.bash:go install -a stdをgo install -a -a -v stdに変更。
コアとなるコードの解説
最も重要な変更は src/cmd/go/build.go に集中しています。
-
cmdBuildとcmdInstallの定義:var cmdBuild = &Command{ UsageLine: "build [-a] [-n] [-v] [-x] [-o output] [importpath... | gofiles...]", // ... } // ... var cmdInstall = &Command{ UsageLine: "install [-a] [-n] [-v] [-x] [importpath...]", // ... }これにより、ユーザーが
go help buildやgo help installを実行した際に、-vフラグが利用可能であることが表示されます。 -
フラグ変数の追加:
var buildV = cmdBuild.Flag.Bool("v", false, "") // ... var installV = cmdInstall.Flag.Bool("v", false, "")Flag.Boolは、コマンドライン引数からブール値のフラグを解析するためのGoの標準ライブラリの機能です。これにより、ユーザーが-vを指定したかどうかがbuildVまたはinstallVに格納されます。 -
builder構造体とinitメソッドの更新:type builder struct { // ... vflag bool // the -v flag // ... } func (b *builder) init(aflag, nflag, vflag, xflag bool) { var err error b.aflag = aflag b.nflag = nflag b.vflag = vflag // ここでフラグの値が構造体に保存される b.xflag = xflag // ... }builder構造体は、ビルドプロセス全体の状態と設定をカプセル化します。initメソッドは、コマンドラインから渡されたフラグの値をこの構造体のフィールドに設定し、後続のビルド処理で利用できるようにします。 -
builder.buildメソッドでの冗長出力:func (b *builder) build(a *action) error { // ... if b.vflag { fmt.Fprintf(os.Stderr, "%s\n", a.p.ImportPath) } // ... }これが冗長出力の核心部分です。
builder.buildメソッドは個々のパッケージのビルドを担当します。b.vflagがtrueの場合(つまり、ユーザーが-vフラグを指定した場合)、fmt.Fprintf(os.Stderr, "%s\n", a.p.ImportPath)が実行され、現在ビルド中のパッケージのインポートパスが標準エラー出力に書き込まれます。標準エラー出力を使用するのは、通常のプログラム出力とは異なる、診断情報や進行状況のメッセージに適しているためです。
これらの変更により、Goのビルドコマンドはよりユーザーフレンドリーになり、特に長時間のビルドにおいて、ユーザーがプロセスの進行状況を把握しやすくなりました。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/146a703cd1ecf096d270873090c8eeef6438b5f7
- Go CL (Change List): https://golang.org/cl/5532055
参考にした情報源リンク
- Go言語公式ドキュメント (go build, go install, go test, go run コマンドに関する情報)
- Go言語のソースコード (特に
src/cmd/goディレクトリ内のファイル) - 一般的なコマンドラインツールの
-v(verbose) フラグの慣習 - Go言語の
flagパッケージのドキュメント - Go言語の
fmtパッケージのドキュメント - Go言語の
osパッケージのドキュメント (特にos.Stderrについて) - Go言語のビルドプロセスに関する一般的な知識
- シェルスクリプト (
.bashファイル) の基本的な構文と実行方法