[インデックス 12659] ファイルの概要
このコミットは、Go言語のバイナリ配布物からcmd/cov
とcmd/prof
という2つのツールを除外することを目的としています。これらのツールは、それぞれコードカバレッジとプロファイリングに使用される開発者向けのユーティリティであり、Goのランタイム環境の標準的な配布には不要と判断されました。
コミット
Go言語のバイナリ配布物からcmd/cov
およびcmd/prof
ツールを除外する変更。これにより、配布物のサイズが削減され、エンドユーザーにとってより関連性の高いコンポーネントのみが含まれるようになります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/86c7bc6e8bd80ef651a92e5103ade11ce159b9d1
元コミット内容
commit 86c7bc6e8bd80ef651a92e5103ade11ce159b9d1
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Thu Mar 15 15:22:56 2012 -0700
misc/dist: don't ship cmd/cov or cmd/prof
Fixes #3317
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/5784083
変更の背景
この変更の背景には、Go言語の公式バイナリ配布物の最適化があります。cmd/cov
とcmd/prof
は、Goアプリケーションの開発、テスト、デバッグにおいて非常に有用なツールですが、これらは主に開発者が使用するものであり、Goのランタイム環境を単に実行するエンドユーザーにとっては必須ではありません。
これらのツールを配布物から除外することで、以下のメリットが期待されます。
- 配布物サイズの削減: 不要なコンポーネントを含まないことで、ダウンロードサイズとディスク使用量を削減できます。
- 配布物の簡素化: エンドユーザーがGoをインストールする際に、必要最低限のコンポーネントのみが提供されるため、配布物の構造がよりシンプルになります。
- 役割の明確化: Goの配布物はランタイムと標準ライブラリに焦点を当て、開発ツールは別途提供されるべきという設計思想に合致します。
この変更は、GoのIssue #3317に対応するものです。
前提知識の解説
cmd/cov
(Go Coverage Tool)
cmd/cov
は、Go言語のコードカバレッジ分析ツールです。通常、go tool cover
コマンドを通じてアクセスされます。その主な目的は以下の通りです。
- インストゥルメンテーション:
go test -cover
を実行すると、テスト中にどのコードが実行されたかを追跡するためにソースコードをインストゥルメントします。 - プロファイル生成:
go test -coverprofile=cover.out
と連携して、詳細なカバレッジプロファイルを生成します。 - 可視化: 生成されたカバレッジプロファイルは、どのコード行がテストによってカバーされたか、またはカバーされなかったかを示すために可視化され、開発者がより多くのテストが必要な領域を特定するのに役立ちます。
- データ操作: Go 1.20以降では、
go tool covdata
コマンドが導入され、特に複数のカバレッジ出力を生成する可能性のある統合テストにおいて、カバレッジデータファイルを読み取り、操作し、マージするのに役立ちます。
cmd/prof
(Go Profiling Tool - pprof
)
cmd/prof
は、Go言語に組み込まれたパフォーマンスプロファイリングツールであり、通常、go tool pprof
コマンドを通じてアクセスされます。これは、開発者がアプリケーションの実行時動作を理解し、パフォーマンスのボトルネックを特定するのに役立ちます。その主要な機能は以下の通りです。
- パフォーマンスデータ収集: 実行中のGoアプリケーションから様々な種類のパフォーマンスデータを収集します。
- ボトルネック特定: 高いCPU使用率、メモリリークのデバッグ、ゴルーチンのボトルネックの理解、アプリケーションパフォーマンスの最適化に使用されます。
- プロファイルタイプ:
pprof
は、CPUプロファイル、メモリ割り当て(ヒープ)プロファイル、ゴルーチンブロッキングプロファイル、ロック競合プロファイル、実行トレースなど、様々な種類のプロファイルを分析できます。 - 可視化と分析: プロファイリングデータを解釈して表示し、収集された情報を可視化および分析するためのテキストベースおよびグラフィカルなレポートを生成します。プロファイルはファイルから読み取ったり、HTTP経由でライブアプリケーションから直接読み取ったりできます。
これらのツールは、Goアプリケーションの品質とパフォーマンスを向上させるために不可欠ですが、Goの実行環境自体には直接関係ありません。
技術的詳細
このコミットは、Goのビルドシステムにおける2つのファイルに変更を加えています。
misc/dist/bindist.go
: このファイルは、Goのバイナリ配布物を構築する際にクリーンアップされるべきファイルやディレクトリのリストを定義しています。src/cmd/dist/build.c
: このファイルは、Goのビルドプロセスを制御するC言語で書かれたスクリプトの一部です。特に、clean
関数はビルド前に不要なファイルを削除する役割を担っています。
変更の核心は、cmd/cov
とcmd/prof
がバイナリ配布物に含まれないように、ビルドプロセス中にこれらが削除されるようにすることです。
コアとなるコードの変更箇所
diff --git a/misc/dist/bindist.go b/misc/dist/bindist.go
index 8fd3bfde0f..b03fd706db 100644
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -43,6 +43,8 @@ const (
)
var preBuildCleanFiles = []string{
+\t"src/cmd/cov",
+\t"src/cmd/prof",
\t"src/pkg/exp",
\t"src/pkg/old",
}
diff --git a/src/cmd/dist/build.c b/src/cmd/dist/build.c
index acd7347aa8..3936f76210 100644
--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -1214,6 +1214,8 @@ clean(void)
\tvinit(&dir);\n \n \tfor(i=0; i<nelem(cleantab); i++) {\n+\t\tif((streq(cleantab[i], \"cmd/cov\") || streq(cleantab[i], \"cmd/prof\")) && !isdir(cleantab[i]))\n+\t\t\tcontinue;\n \t\tbpathf(&path, \"%s/src/%s\", goroot, cleantab[i]);\n \t\txreaddir(&dir, bstr(&path));\n \t\t// Remove generated files.\n```
## コアとなるコードの解説
### `misc/dist/bindist.go` の変更
`bindist.go`ファイルでは、`preBuildCleanFiles`という文字列スライスの定義に2行が追加されています。
```go
var preBuildCleanFiles = []string{
"src/cmd/cov",
"src/cmd/prof",
"src/pkg/exp",
"src/pkg/old",
}
preBuildCleanFiles
は、Goのバイナリ配布物をビルドする前にクリーンアップ(削除)されるべきファイルパスのリストです。ここに"src/cmd/cov"
と"src/cmd/prof"
が追加されたことにより、バイナリ配布物の作成プロセスが開始される前に、これらのディレクトリが確実に削除されるようになります。これにより、最終的な配布物にはこれらのツールが含まれなくなります。
src/cmd/dist/build.c
の変更
build.c
ファイルでは、clean
関数内に条件分岐が追加されています。
if((streq(cleantab[i], "cmd/cov") || streq(cleantab[i], "cmd/prof")) && !isdir(cleantab[i]))
continue;
このコードは、cleantab
(クリーンアップ対象のパスのテーブル)内の現在のエントリが"cmd/cov"
または"cmd/prof"
であり、かつそれがディレクトリではない場合に、現在のループのイテレーションをスキップ(continue
)するように指示しています。
これは、preBuildCleanFiles
にこれらのパスが追加されたことと関連しています。もし何らかの理由でsrc/cmd/cov
やsrc/cmd/prof
がディレクトリとして存在しない場合(例えば、以前のビルドで既に削除されている、またはクリーンなリポジトリでビルドしている場合など)、isdir(cleantab[i])
がfalse
となり、この条件が真になります。これにより、存在しないディレクトリを削除しようとしてエラーになるのを防ぎ、ビルドプロセスが中断しないようにするための安全策として機能します。
要するに、この変更は、cmd/cov
とcmd/prof
がバイナリ配布物から除外されることを保証しつつ、ビルドスクリプトの堅牢性を高めるものです。
関連リンク
- Go Issue #3317: https://code.google.com/p/go/issues/detail?id=3317 (現在はGoの新しいIssueトラッカーにリダイレクトされる可能性があります)
- Go CL 5784083: https://golang.org/cl/5784083
参考にした情報源リンク
- Go Code Coverage: https://go.dev/blog/cover
- Go Tool Covdata: https://go.dev/doc/go1.20#covdata
- Go Profiling (pprof): https://go.dev/blog/pprof
- Medium記事: Go Code Coverage: https://medium.com/@go_lang_fan/go-code-coverage-a-comprehensive-guide-to-measuring-and-improving-test-effectiveness-1234567890ab (これは一般的な情報源の例であり、特定の記事へのリンクではありません)
- Medium記事: Go pprof: https://medium.com/@go_lang_fan/go-pprof-a-deep-dive-into-performance-profiling-for-go-applications-1234567890ab (これは一般的な情報源の例であり、特定の記事へのリンクではありません)