[インデックス 16094] ファイルの概要
このコミットは、Go言語のディストリビューションビルドツールである misc/dist/bindist.go に2つの主要な変更を加えています。一つは、ビルドされるGoディストリビューションのバージョン名を上書きするための -version フラグの追加です。もう一つは、ソースディストリビューションを作成する際にGo Tourをビルドしないようにする変更です。これにより、ソースディストリビューションのサイズが削減され、ビルドプロセスが効率化されます。
コミット
commit 5d1c7bd1a66544376cf267706b005462b275f6a6
Author: Andrew Gerrand <adg@golang.org>
Date: Thu Apr 4 14:21:19 2013 +1100
misc/dist: add -version flag to override version name
Also, don't build the tour when making the source distribution.
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/8354043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5d1c7bd1a66544376cf267706b005462b275f6a6
元コミット内容
misc/dist: add -version flag to override version name
Also, don't build the tour when making the source distribution.
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/8354043
変更の背景
このコミットは、Go言語の公式ディストリビューションビルドプロセスにおける2つの課題に対処するために行われました。
-
バージョン名の柔軟性向上: 従来のビルドプロセスでは、Goディストリビューションのバージョン名は、リポジトリのタグ情報などから自動的に決定されていました。しかし、特定のリリースプロセスやテストシナリオにおいては、この自動生成されたバージョン名を明示的に上書きしたいというニーズがありました。例えば、カスタムビルドやプレリリース版に特定の識別子を付与したい場合などです。
-versionフラグの追加により、この柔軟性が提供されます。 -
ソースディストリビューションの最適化: Go Tourは、Go言語の学習を支援するためのインタラクティブなチュートリアルであり、Goディストリビューションの一部として配布されています。しかし、ソースディストリビューション(バイナリを含まない、ソースコードのみの配布)の場合、Go Tourのソースコードや関連ファイルを含めることは、ディストリビューションのサイズを不必要に増加させ、ダウンロード時間やストレージ要件に影響を与える可能性があります。ソースディストリビューションの目的は、開発者がGoのソースコードからビルドできるようにすることであり、Go Tourの実行環境は通常、別途用意されるか、バイナリディストリビューションに含まれることが期待されます。したがって、ソースディストリビューションからGo Tourのビルドを除外することで、より軽量で目的に特化したパッケージを提供できるようになります。
これらの変更は、Goのリリースエンジニアリングとディストリビューション管理の効率化と柔軟性向上を目的としています。
前提知識の解説
このコミットを理解するためには、以下の概念について知っておく必要があります。
- Go言語のビルドシステム: Go言語は、
go buildやgo installといったコマンドを通じて、ソースコードからバイナリを生成します。Goの標準ライブラリやツール群も、Go自身で書かれており、Goのビルドシステムによってコンパイルされます。 misc/distディレクトリ: Goプロジェクトのルートディレクトリにあるmisc/distは、Goの公式ディストリビューション(バイナリ配布やソース配布)を作成するためのスクリプトやツールが含まれるディレクトリです。bindist.goはその中核をなすGoプログラムの一つで、様々なプラットフォーム向けのGoバイナリパッケージやソースパッケージを生成するロジックをカプセル化しています。flagパッケージ: Goの標準ライブラリであるflagパッケージは、コマンドライン引数を解析し、プログラム内で利用するための機能を提供します。flag.String,flag.Boolなどを用いて、特定のフラグとそのデフォルト値、説明を定義します。go install -race std:go install: 指定されたパッケージをコンパイルし、インストールします。通常は$GOPATH/binまたは$GOBINに実行可能ファイルを、$GOPATH/pkgにコンパイル済みパッケージを配置します。-race: Goの組み込みのデータ競合検出器を有効にしてビルドします。これにより、実行時にデータ競合を検出できるようになりますが、ビルドされたバイナリは通常よりも大きく、実行速度も遅くなります。std: Goの標準ライブラリパッケージ全体を指します。- このコマンドは、標準ライブラリをデータ競合検出器を有効にした状態でビルドし、インストールすることを意味します。これは、Goのビルドプロセスにおいて、標準ライブラリの健全性を確認するための一環として行われることがあります。
- Go Tour: Go言語の公式チュートリアルであり、Webブラウザ上でインタラクティブにGoのコードを記述・実行しながら学習できるツールです。通常、Goのバイナリディストリビューションに含まれています。
- Mercurial (Hg): GoプロジェクトはかつてMercurialという分散型バージョン管理システムを使用していました。コミットメッセージやコード内の
mercurial tagという記述はその名残です。現在はGitに移行しています。 - Google Code: かつてGoogleが提供していたオープンソースプロジェクトホスティングサービスです。Goプロジェクトも以前はGoogle Codeでホストされており、コミットメッセージの
https://golang.org/cl/8354043やupload resulting files to Google Codeといった記述はその歴史的な背景を示しています。golang.org/cl/は、Goプロジェクトがコードレビューに利用しているGerritシステムへのリンクです。
技術的詳細
このコミットは、misc/dist/bindist.go ファイルに対して以下の主要な技術的変更を加えています。
-
-versionフラグの追加:varブロックにversionOverride = flag.String("version", "", "override version name")という新しいフラグ定義が追加されました。- これにより、コマンドラインから
-version <your_version_string>の形式でバージョン名を指定できるようになります。 Do()メソッド内で、Goのバージョン情報を取得した後、*versionOverride != ""(つまり、-versionフラグが指定されている場合) には、取得したバージョン情報ではなく、*versionOverrideの値がversion変数に代入されるようになりました。これにより、最終的に生成されるVERSIONファイルの内容や、アップロード時のファイル名、ラベルに反映されるバージョン名を制御できます。
-
Go Tour ビルドの条件付き実行:
- 変更前は、
b.tour()の呼び出しがif err := b.tour(); err != nil { return err }のように、常に実行されるロジックの一部として存在していました。 - 変更後は、
b.tour()の呼び出しがif !b.Source && *includeRace { ... }ブロックの外に移動し、かつ、その前にerr = b.tour()が追加されました。 - 重要なのは、
b.Sourceというフィールド(おそらくソースディストリビューションをビルドしているかどうかを示すブール値)がfalseの場合にのみb.tour()が実行されるように、ロジックが変更された点です。 - 具体的には、
if !b.Sourceの条件が明示的に追加されたわけではありませんが、既存のif !b.Source && *includeRaceブロックの構造が変更され、b.tour()の呼び出しがそのブロックの外に移動し、if err != nil { return err }の直前に配置されました。これにより、ソースディストリビューション (b.Sourceがtrueの場合) ではb.tour()が呼び出されなくなります。
- 変更前は、
-
go install -race stdの実行順序とエラーハンドリングの改善:- 変更前は、
make.bashの実行後にエラーチェックがあり、その後にgo install -race stdとgo install -a stdが実行されていました。 - 変更後は、
make.bashの実行結果のエラーチェックがif *includeRaceブロックの内部に移動しました。これにより、make.bashの実行が成功した場合にのみ、-raceビルドとそれに続く標準ライブラリの再インストールが行われるようになりました。 - また、
go install -race stdとgo install -a stdの各ステップでエラーが発生した場合に、即座にエラーを返すようにエラーハンドリングが改善されています。
- 変更前は、
-
ラベル生成ロジックの堅牢化:
Upload関数内で、Google Codeにアップロードする際のラベル(例:OpSys-linux,Type-Source)を生成する部分が変更されました。- 変更前は
labels = append(labels, "OpSys-"+opsys, "Type-"+ftype)のように、opsysやftypeが空文字列であっても無条件にラベルを追加していました。 - 変更後は
if opsys != "" { labels = append(labels, "OpSys-"+opsys) }とif ftype != "" { labels = append(labels, "Type-"+ftype) }のように、opsysやftypeが空でない場合にのみラベルを追加するようになりました。これにより、不必要な空のラベルが生成されるのを防ぎ、よりクリーンなラベル付けが可能になります。
これらの変更は、bindist.go の堅牢性、柔軟性、および効率性を向上させるものです。
コアとなるコードの変更箇所
misc/dist/bindist.go ファイルにおける主要な変更箇所は以下の通りです。
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -29,14 +29,15 @@ import (
)
var (
- tag = flag.String("tag", "release", "mercurial tag to check out")
- repo = flag.String("repo", "https://code.google.com/p/go", "repo URL")
- tourPath = flag.String("tour", "code.google.com/p/go-tour", "Go tour repo import path")
- verbose = flag.Bool("v", false, "verbose output")
- upload = flag.Bool("upload", true, "upload resulting files to Google Code")
- wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
- addLabel = flag.String("label", "", "additional label to apply to file when uploading")
- includeRace = flag.Bool("race", true, "build race detector packages")
+ tag = flag.String("tag", "release", "mercurial tag to check out")
+ repo = flag.String("repo", "https://code.google.com/p/go", "repo URL")
+ tourPath = flag.String("tour", "code.google.com/p/go-tour", "Go tour repo import path")
+ verbose = flag.Bool("v", false, "verbose output")
+ upload = flag.Bool("upload", true, "upload resulting files to Google Code")
+ wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
+ addLabel = flag.String("label", "", "additional label to apply to file when uploading")
+ includeRace = flag.Bool("race", true, "build race detector packages")
+ versionOverride = flag.String("version", "", "override version name")
username, password string // for Google Code upload
)
@@ -184,28 +185,28 @@ func (b *Build) Do() error {
} else {
_, err = b.run(src, "bash", "make.bash")
}
- }
- if err != nil {
- return err
- }
- if !b.Source && *includeRace {
- goCmd := filepath.Join(b.root, "bin", "go")
- if b.OS == "windows" {
- goCmd += ".exe"
- }
- _, err = b.run(src, goCmd, "install", "-race", "std")
- if err != nil {
- return err
+ // 変更前: } の後に err != nil のチェックと race ビルドのロジックが続く
+ // 変更後: make.bash のエラーチェックと race ビルドのロジックが統合され、tour() の呼び出し位置も変更
+ if *includeRace { // race ビルドが有効な場合
+ if err != nil { // make.bash の実行でエラーが発生した場合
+ return err
}
- // Re-install std without -race, so that we're not left with
- // a slower, race-enabled cmd/go, cmd/godoc, etc.
- _, err = b.run(src, goCmd, "install", "-a", "std")
+ goCmd := filepath.Join(b.root, "bin", "go")
+ if b.OS == "windows" {
+ goCmd += ".exe"
+ }
+ _, err = b.run(src, goCmd, "install", "-race", "std") // -race 付きで標準ライブラリをインストール
if err != nil {
return err
}
+ // Re-install std without -race, so that we're not left with
+ // a slower, race-enabled cmd/go, cmd/godoc, etc.
+ _, err = b.run(src, goCmd, "install", "-a", "std") // -race なしで標準ライブラリを再インストール
+ if err != nil {
+ return err
+ }
}
-\n-\tif err := b.tour(); err != nil {
+\terr = b.tour() // tour() の呼び出し位置が変更され、エラーハンドリングも変更
+ if err != nil {
return err
}
@@ -229,6 +230,9 @@ func (b *Build) Do() error {
fullVersion = bytes.TrimSpace(fullVersion)
v := bytes.SplitN(fullVersion, []byte(" "), 2)
version = string(v[0])
+ if *versionOverride != "" { // -version フラグが指定されている場合、バージョンを上書き
+ version = *versionOverride
+ }
// Write VERSION file.
err = ioutil.WriteFile(filepath.Join(b.root, "VERSION"), fullVersion, 0644)
@@ -522,7 +526,12 @@ func (b *Build) Upload(version string, filename string) error {
ftype = "Source"
summary = fmt.Sprintf("%s (source only)", version)
}\n- labels = append(labels, "OpSys-"+opsys, "Type-"+ftype)
+ // 変更前: labels = append(labels, "OpSys-"+opsys, "Type-"+ftype)
+ // 変更後: opsys または ftype が空でない場合にのみラベルを追加
+ if opsys != "" {
+ labels = append(labels, "OpSys-"+opsys)
+ }
+ if ftype != "" {
+ labels = append(labels, "Type-"+ftype)
+ }
if *addLabel != "" {
labels = append(labels, *addLabel)
}
コアとなるコードの解説
-
-versionフラグの追加 (varブロック):+ versionOverride = flag.String("version", "", "override version name")flag.Stringを使用して、versionOverrideという新しいグローバル変数を定義しています。これはコマンドライン引数-versionに対応し、デフォルト値は空文字列""、説明は "override version name" です。この変数は、プログラムの実行時にユーザーが指定したバージョン文字列を保持します。 -
Go Tour ビルドの条件付き実行と
go install -raceのロジック変更 (func (b *Build) Do() error): 変更前は、make.bashの実行後にエラーチェックがあり、その後に!b.Source && *includeRaceの条件でgo install -race stdが実行され、さらにその後にb.tour()が実行されていました。変更後は、
make.bashの実行後のエラーチェックがif *includeRaceブロックの内部に移動しました。if *includeRace { if err != nil { return err } // ... go install -race std and go install -a std ... } err = b.tour() // Go Tour のビルド呼び出しがここに移動 if err != nil { return err }この変更により、
b.tour()の呼び出しは、*includeRaceの条件とは独立して実行されるようになりました。しかし、元のコードのif !b.Sourceの条件がb.tour()の呼び出しに影響を与えていたため、この変更によってb.Sourceがtrue(ソースディストリビューション) の場合にはb.tour()が実行されないという意図が維持されています。これは、b.tour()メソッド内部でb.Sourceの値に基づいて処理をスキップするロジックがあるか、または、このDo()メソッドの呼び出し元でb.Sourceの値に応じてb.tour()の実行パスが制御されていることを示唆しています。コミットメッセージの「don't build the tour when making the source distribution」という記述から、後者の可能性が高いです。 -
バージョン名の上書きロジック (
func (b *Build) Do() error):version = string(v[0]) + if *versionOverride != "" { + version = *versionOverride + }Goのバージョン情報(例:
go1.1)がfullVersionから抽出され、version変数に代入された後、この新しいロジックが適用されます。もしversionOverrideフラグが空文字列でなければ(つまり、ユーザーが-versionフラグを指定した場合)、version変数の値は*versionOverrideの値で上書きされます。これにより、ビルドされるGoディストリビューションのバージョン名をプログラム的に制御できるようになります。 -
ラベル生成ロジックの改善 (
func (b *Build) Upload(version string, filename string) error):- labels = append(labels, "OpSys-"+opsys, "Type-"+ftype) + if opsys != "" { + labels = append(labels, "OpSys-"+opsys) + } + if ftype != "" { + labels = append(labels, "Type-"+ftype) + }Google Codeへのアップロード時に使用されるラベルを生成する部分です。変更前は
opsys(オペレーティングシステム) やftype(ファイルタイプ、例: "Source", "Binary") が空文字列であっても、"OpSys-"や"Type-"といったプレフィックス付きの空のラベルが生成されていました。変更後は、opsysやftypeが実際に値を持っている場合にのみ、対応するラベルがlabelsスライスに追加されるようになりました。これにより、生成されるラベルがより正確で意味のあるものになります。
関連リンク
- Gerrit Change-ID: https://golang.org/cl/8354043 このリンクは、Goプロジェクトがコードレビューに利用しているGerritシステム上の変更セット(Change-ID)を示しています。コミットがGitHubにマージされる前に、ここでレビューと承認が行われます。
参考にした情報源リンク
- Go言語の
flagパッケージに関する公式ドキュメント: https://pkg.go.dev/flag - Go言語の
go installコマンドに関する公式ドキュメント: https://go.dev/cmd/go/#hdr-Compile_and_install_packages_and_dependencies - Go Tourに関する情報: https://go.dev/tour/
- Go言語のリリースプロセスに関する一般的な情報 (Goの公式ブログやドキュメントを参照)
- Mercurial (Hg) と Git のバージョン管理システムに関する一般的な知識。
- Google Code (歴史的背景として) に関する一般的な知識。