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

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

このコミットは、Go言語のディストリビューションビルドプロセスを管理する misc/dist/bindist.go ファイルに対する変更です。このファイルは、Goの公式バイナリディストリビューションを生成する際に、Go本体のリポジトリだけでなく、go.toolsgo-tour といった関連プロジェクトのツールも適切に含めるためのロジックを定義しています。具体的には、Goのソースコードのクローン、ビルド、各種ツールの取得と配置、そして最終的なアーカイブの作成といった一連のプロセスを自動化しています。

コミット

misc/dist: include godoc from go.tools

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12075045

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

https://github.com/golang/go/commit/87380415e0a6634e822d4afbb506eaa74d6acf12

元コミット内容

このコミットは、Go言語のディストリビューションビルドスクリプトである misc/dist/bindist.go を変更し、godoc ツールを go.tools リポジトリから取得して含めるようにします。これにより、godoc はGo本体のビルドプロセスから独立し、go.tools プロジェクトの一部として管理されるようになります。

変更の背景

この変更の背景には、Goエコシステムのツール群のモジュール化と、ビルドプロセスの効率化があります。

元々、godoc はGo言語の標準ディストリビューションの一部として、Go本体のリポジトリ内で開発・管理されていました。しかし、Goエコシステムが成熟するにつれて、godoc のようなツールはGo本体のコア言語とは異なる開発サイクルや依存関係を持つようになりました。

go.tools プロジェクトは、go vetgoimportsgorename、そして godoc といった、Go言語の開発を支援する様々なツールを集約するために作成されました。これらのツールを go.tools に移行することで、以下のメリットが生まれます。

  1. 独立した開発とリリースサイクル: godoc のようなツールは、Go言語のリリースサイクルに縛られずに、独立して機能追加やバグ修正を行うことができるようになります。
  2. 依存関係の明確化: Go本体のビルドプロセスから godoc のビルドを分離することで、Go本体のビルドに必要な依存関係がより明確になります。
  3. ビルド時間の短縮: Go本体のビルド時に godoc をビルドする必要がなくなるため、全体のビルド時間が短縮される可能性があります。
  4. ツールの管理の簡素化: ユーザーは go get コマンドを使って go.tools から最新のツールを簡単に取得できるようになります。

このコミットは、godocgo.tools から取得するように bindist.go を修正することで、このモジュール化の取り組みをGoの公式ディストリビューションに反映させるものです。また、go-tour も同様に外部リポジトリから取得する形に整理されています。

前提知識の解説

  • godoc: Go言語のソースコードからドキュメントを生成し、HTTPサーバーとして提供するツールです。Goの標準ライブラリのドキュメント閲覧や、自身のプロジェクトのドキュメント生成に広く利用されます。
  • go.tools: Go言語の開発を支援する様々なツール(go vet, goimports, gorename, godoc など)が格納されているリポジトリです。これらのツールはGo本体とは独立して開発・管理されています。
  • go-tour: Go言語の基本的な概念をインタラクティブに学ぶことができるWebベースのチュートリアルです。
  • misc/dist/bindist.go: Go言語の公式バイナリディストリビューションをビルドするためのGoプログラムです。このプログラムは、Goのソースコードの取得、ビルド、関連ツールの組み込み、そして最終的なアーカイブの作成といった一連のプロセスを自動化します。
  • GOPATH: Goのワークスペースのルートディレクトリを指す環境変数です。Goのソースコード、パッケージ、実行可能ファイルが配置されます。
  • GOROOT: Goのインストールディレクトリを指す環境変数です。Goの標準ライブラリやツールが配置されます。
  • go get: リモートリポジトリからGoのパッケージやコマンドを取得し、ビルドしてインストールするGoコマンドです。
  • hg (Mercurial): 分散型バージョン管理システムの一つです。GoプロジェクトはかつてMercurialを使用していましたが、後にGitに移行しました。このコミットが作成された時点では、まだMercurialが使用されていました。
  • race detector: Goの並行処理におけるデータ競合(data race)を検出するためのツールです。ビルド時に -race フラグを付けることで有効になります。パフォーマンスに影響を与えるため、通常は開発・テスト時にのみ使用されます。

技術的詳細

このコミットの主要な変更点は、godoc のビルドと組み込みの方法を misc/dist/bindist.go 内で変更したことです。

  1. godocPath 定数の追加: const godocPath = "code.google.com/p/go.tools/cmd/godoc" が追加されました。これにより、godoc のインポートパスが明示的に定義され、go.tools リポジトリ内の godoc コマンドを指すようになります。

  2. tourPath の定数化: tourPath も同様に flag.String から定数 const tourPath = "code.google.com/p/go-tour" に変更されました。これにより、go-tour のリポジトリパスも固定化され、ビルドプロセスがより堅牢になります。

  3. Build.Do() メソッドの変更: Build.Do() メソッド内で、godoc のビルドに関するコメントが変更されました。 - // with a slower, race-enabled cmd/go, cmd/godoc, etc. + // with a slower, race-enabled cmd/go, etc. これは、godoc がGo本体のビルドプロセスで -race フラグ付きでビルドされなくなったことを示唆しています。代わりに、新しい godoc() 関数で独立して取得されるため、このコメントが修正されました。 また、b.tour() の呼び出しの前に err = b.godoc() が追加され、godoc の取得とインストールがビルドプロセスに組み込まれました。

  4. 新しい Build.godoc() メソッドの追加: このコミットの最も重要な変更点です。

    • defer ステートメントで、GOPATH ディレクトリ内の bin, pkg, src ディレクトリをクリーンアップする処理が定義されています。これは、go get で一時的にダウンロードされたソースコードやビルド成果物を削除するためのものです。
    • b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", godocPath) を使用して、go get コマンドを実行し、godoc パッケージをダウンロードしてインストールします。go get は、指定されたパスのパッケージを GOPATH にダウンロードし、コマンドの場合は GOROOT/bin または GOPATH/bin に実行可能ファイルをインストールします。
    • cpDir 関数を使用して、go.tools/cmd/godoc/template ディレクトリ内のテンプレートファイルを GOROOT/lib/godoc にコピーします。godoc はこれらのテンプレートを使用してドキュメントをレンダリングするため、これらをGoのディストリビューションに含める必要があります。
  5. Build.tour() メソッドの変更: tourPath が定数になったことに伴い、*tourPath の参照が tourPath に変更されました。これにより、go-tour の取得も定数で指定されたパスから行われるようになります。 また、実行可能ファイルの拡張子を取得する ext() ヘルパー関数が導入され、filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext()) のように使用されるようになりました。これにより、Windows環境での .exe 拡張子の扱いがより汎用的に行われます。

  6. 新しい ext() ヘルパー関数の追加: オペレーティングシステムに基づいて実行可能ファイルの拡張子(Windowsの場合は .exe、それ以外の場合は空文字列)を返すシンプルな関数です。これにより、クロスプラットフォームでの実行可能ファイルのパス構築が簡素化されます。

  7. 新しい Build.hgCmd() ヘルパー関数の追加: Mercurialコマンドを実行するためのヘルパー関数です。--config extensions.codereview=! オプションを自動的に追加します。これは、Mercurialのコードレビュー拡張機能を無効にするための設定であり、ビルドプロセス中に予期せぬ動作を防ぐ目的があると考えられます。

  8. Mercurialコマンドの呼び出しの変更: b.run(work, "hg", "clone", ...)b.run(b.root, "hg", "update", ...) といった直接的な hg コマンドの呼び出しが、新しく追加された b.hgCmd() ヘルパー関数に置き換えられました。これにより、Mercurialコマンドの実行が一元化され、共通のオプションが適用されるようになります。

これらの変更により、Goのディストリビューションビルドプロセスは、godocgo-tour といった外部ツールをよりモジュール的に、かつ効率的に組み込むことができるようになりました。

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

--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -31,7 +31,6 @@ 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")
@@ -44,6 +43,8 @@ var (
 
 const (
 	uploadURL = "https://go.googlecode.com/files"
+	godocPath = "code.google.com/p/go.tools/cmd/godoc"
+	tourPath  = "code.google.com/p/go-tour"
 )
 
 var preBuildCleanFiles = []string{
@@ -173,11 +174,11 @@ func (b *Build) Do() error {
 	b.gopath = work
 
 	// Clone Go distribution and update to tag.
-	_, err = b.run(work, "hg", "clone", "-q", *repo, b.root)
+	_, err = b.hgCmd(work, "clone", *repo, b.root)
 	if err != nil {
 		return err
 	}
-	_, err = b.run(b.root, "hg", "update", *tag)
+	_, err = b.hgCmd(b.root, "update", *tag)
 	if err != nil {
 		return err
 	}
@@ -214,7 +215,7 @@ func (b *Build) Do() error {
 				return err
 			}
 			// Re-install std without -race, so that we're not left
-			// with a slower, race-enabled cmd/go, cmd/godoc, etc.
+			// with a slower, race-enabled cmd/go, etc.
 			_, err = b.run(src, goCmd, "install", "-a", "std")
 			// Re-building go command leaves old versions of go.exe as go.exe~ on windows.
 			// See (*builder).copyFile in $GOROOT/src/cmd/go/build.go for details.
@@ -226,6 +227,10 @@ func (b *Build) Do() error {
 		if err != nil {
 			return err
 		}
+		err = b.godoc()
+		if err != nil {
+			return err
+		}
 		err = b.tour()
 	}
 	if err != nil {
@@ -408,6 +413,28 @@ func (b *Build) Do() error {
 	return err
 }
 
+func (b *Build) godoc() error {
+	defer func() {
+		// Clean work files from GOPATH directory.
+		for _, d := range []string{"bin", "pkg", "src"} {
+			os.RemoveAll(filepath.Join(b.gopath, d))
+		}
+	}()
+
+	// go get the godoc package.
+	// The go tool knows to install to $GOROOT/bin.
+	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", godocPath)
+	if err != nil {
+		return err
+	}
+
+	// Copy templates from go.tools/cmd/godoc/template to GOROOT/lib/godoc.
+	return cpDir(
+		filepath.Join(b.root, "lib", "godoc"),
+		filepath.Join(b.gopath, "src", filepath.FromSlash(godocPath), "template"),
+	)
+}
+
 func (b *Build) tour() error {
 	defer func() {
 		// Clean work files from GOPATH directory.
@@ -417,13 +444,13 @@ func (b *Build) tour() error {
 	}()
 
 	// go get the gotour package.
-	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", *tourPath+"/gotour")
+	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", tourPath+"/gotour")
 	if err != nil {
 		return err
 	}
 
 	// Copy all the tour content to $GOROOT/misc/tour.
-	importPath := filepath.FromSlash(*tourPath)
+	importPath := filepath.FromSlash(tourPath)
 	tourSrc := filepath.Join(b.gopath, "src", importPath)
 	contentDir := filepath.Join(b.root, "misc", "tour")
 	if err = cpAllDir(contentDir, tourSrc, tourContent...); err != nil {
@@ -436,16 +463,23 @@ func (b *Build) tour() error {
 	}
 
 	// Copy gotour binary to tool directory as "tour"; invoked as "go tool tour".
-	ext := ""
-	if runtime.GOOS == "windows" {
-		ext = ".exe"
-	}
 	return cp(
-		filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext),
-		filepath.Join(b.gopath, "bin", "gotour"+ext),
+		filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext()),
+		filepath.Join(b.gopath, "bin", "gotour"+ext()),
 	)
 }
 
+func ext() string {
+	if runtime.GOOS == "windows" {
+		return ".exe"
+	}
+	return ""
+}
+
+func (b *Build) hgCmd(dir string, args ...string) ([]byte, error) {
+	return b.run(dir, "hg", append([]string{"--config", "extensions.codereview=!"}, args...)...)
+}
+
 func (b *Build) run(dir, name string, args ...string) ([]byte, error) {
 	buf := new(bytes.Buffer)
 	absName, err := lookPath(name)

コアとなるコードの解説

  1. 定数の変更と追加:

    • tourPathflag.String から const に変更され、godocPath が新しく追加されました。これにより、godocgo-tour のソースリポジトリパスがビルドスクリプト内で固定化され、外部からの設定に依存しなくなりました。これは、これらのツールがGoディストリビューションの標準的な一部として扱われることを意味します。
  2. Build.Do() 内での godoc() 呼び出し:

    • b.godoc() の呼び出しが b.tour() の前に挿入されました。これは、Goディストリビューションのビルドプロセスにおいて、godocgo-tour と同様に、Go本体のビルド後に外部から取得・組み込まれるようになったことを示しています。
  3. Build.godoc() 関数の新規追加:

    • この関数は godoc ツールをGoディストリビューションに組み込むためのロジックをカプセル化しています。
    • defer を用いて、go get によって一時的に作成された GOPATH 内の作業ファイルをクリーンアップする処理が記述されています。これにより、ビルド環境が常にクリーンに保たれます。
    • go get コマンド (filepath.Join(b.root, "bin", "go"), "get", godocPath) を実行し、go.tools リポジトリから godoc を取得し、Goのツールディレクトリにインストールします。
    • cpDir 関数を使って、go.tools/cmd/godoc/template にある godoc のHTMLテンプレートファイルを GOROOT/lib/godoc にコピーします。godoc が正しく機能するためにはこれらのテンプレートが必要です。
  4. Build.tour() 関数の変更:

    • tourPath が定数になったことに伴い、*tourPath の参照が tourPath に変更されました。
    • 実行可能ファイルの拡張子を動的に取得するために、新しく追加された ext() 関数が使用されるようになりました。これにより、Windows環境での .exe 拡張子の扱いがより汎用的になりました。
  5. ext() 関数の新規追加:

    • 現在のOSがWindowsであれば .exe を、そうでなければ空文字列を返すシンプルなヘルパー関数です。これにより、クロスプラットフォームでの実行可能ファイル名の構築が容易になります。
  6. Build.hgCmd() 関数の新規追加と利用:

    • Mercurialコマンドを実行するためのラッパー関数です。この関数は、hg コマンドに常に --config extensions.codereview=! オプションを付加します。これは、ビルドプロセス中にMercurialのコードレビュー拡張機能が干渉しないようにするための設定です。
    • hg clonehg update の呼び出しが、直接 b.run を使う代わりに b.hgCmd を使うように変更されました。これにより、Mercurialコマンドの実行が一元化され、共通の設定が適用されるようになりました。

これらの変更は、Goのビルドシステムが、Go本体と関連ツール(godocgo-tour)の間の依存関係をより明確にし、それぞれのコンポーネントを独立して管理・更新できるようにするための重要なステップを示しています。

関連リンク

参考にした情報源リンク

  • コミット情報: /home/orange/Project/comemo/commit_data/16976.txt
  • GitHub上のコミットページ: https://github.com/golang/go/commit/87380415e0a6634e822d4afbb506eaa74d6acf12
  • Go言語のビルドシステムに関する一般的な知識
  • go get コマンドの動作に関する知識
  • Mercurial (hg) コマンドに関する知識
  • Go言語の環境変数 (GOPATH, GOROOT) に関する知識
  • Go言語のツールエコシステムに関する一般的な知識# [インデックス 16976] ファイルの概要

このコミットは、Go言語のディストリビューションビルドプロセスを管理する misc/dist/bindist.go ファイルに対する変更です。このファイルは、Goの公式バイナリディストリビューションを生成する際に、Go本体のリポジトリだけでなく、go.toolsgo-tour といった関連プロジェクトのツールも適切に含めるためのロジックを定義しています。具体的には、Goのソースコードのクローン、ビルド、各種ツールの取得と配置、そして最終的なアーカイブの作成といった一連のプロセスを自動化しています。

コミット

misc/dist: include godoc from go.tools

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12075045

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

https://github.com/golang/go/commit/87380415e0a6634e822d4afbb506eaa74d6acf12

元コミット内容

このコミットは、Go言語のディストリビューションビルドスクリプトである misc/dist/bindist.go を変更し、godoc ツールを go.tools リポジトリから取得して含めるようにします。これにより、godoc はGo本体のビルドプロセスから独立し、go.tools プロジェクトの一部として管理されるようになります。

変更の背景

この変更の背景には、Goエコシステムのツール群のモジュール化と、ビルドプロセスの効率化があります。

元々、godoc はGo言語の標準ディストリビューションの一部として、Go本体のリポジトリ内で開発・管理されていました。しかし、Goエコシステムが成熟するにつれて、godoc のようなツールはGo本体のコア言語とは異なる開発サイクルや依存関係を持つようになりました。

go.tools プロジェクトは、go vetgoimportsgorename、そして godoc といった、Go言語の開発を支援する様々なツールを集約するために作成されました。これらのツールを go.tools に移行することで、以下のメリットが生まれます。

  1. 独立した開発とリリースサイクル: godoc のようなツールは、Go言語のリリースサイクルに縛られずに、独立して機能追加やバグ修正を行うことができるようになります。
  2. 依存関係の明確化: Go本体のビルドプロセスから godoc のビルドを分離することで、Go本体のビルドに必要な依存関係がより明確になります。
  3. ビルド時間の短縮: Go本体のビルド時に godoc をビルドする必要がなくなるため、全体のビルド時間が短縮される可能性があります。
  4. ツールの管理の簡素化: ユーザーは go get コマンドを使って go.tools から最新のツールを簡単に取得できるようになります。

このコミットは、godocgo.tools から取得するように bindist.go を修正することで、このモジュール化の取り組みをGoの公式ディストリビューションに反映させるものです。また、go-tour も同様に外部リポジトリから取得する形に整理されています。

前提知識の解説

  • godoc: Go言語のソースコードからドキュメントを生成し、HTTPサーバーとして提供するツールです。Goの標準ライブラリのドキュメント閲覧や、自身のプロジェクトのドキュメント生成に広く利用されます。
  • go.tools: Go言語の開発を支援する様々なツール(go vet, goimports, gorename, godoc など)が格納されているリポジトリです。これらのツールはGo本体とは独立して開発・管理されています。
  • go-tour: Go言語の基本的な概念をインタラクティブに学ぶことができるWebベースのチュートリアルです。
  • misc/dist/bindist.go: Go言語の公式バイナリディストリビューションをビルドするためのGoプログラムです。このプログラムは、Goのソースコードの取得、ビルド、関連ツールの組み込み、そして最終的なアーカイブの作成といった一連のプロセスを自動化します。
  • GOPATH: Goのワークスペースのルートディレクトリを指す環境変数です。Goのソースコード、パッケージ、実行可能ファイルが配置されます。
  • GOROOT: Goのインストールディレクトリを指す環境変数です。Goの標準ライブラリやツールが配置されます。
  • go get: リモートリポジトリからGoのパッケージやコマンドを取得し、ビルドしてインストールするGoコマンドです。
  • hg (Mercurial): 分散型バージョン管理システムの一つです。GoプロジェクトはかつてMercurialを使用していましたが、後にGitに移行しました。このコミットが作成された時点では、まだMercurialが使用されていました。
  • race detector: Goの並行処理におけるデータ競合(data race)を検出するためのツールです。ビルド時に -race フラグを付けることで有効になります。パフォーマンスに影響を与えるため、通常は開発・テスト時にのみ使用されます。

技術的詳細

このコミットの主要な変更点は、godoc のビルドと組み込みの方法を misc/dist/bindist.go 内で変更したことです。

  1. godocPath 定数の追加: const godocPath = "code.google.com/p/go.tools/cmd/godoc" が追加されました。これにより、godoc のインポートパスが明示的に定義され、go.tools リポジトリ内の godoc コマンドを指すようになります。

  2. tourPath の定数化: tourPath も同様に flag.String から定数 const tourPath = "code.google.com/p/go-tour" に変更されました。これにより、go-tour のリポジトリパスも固定化され、ビルドプロセスがより堅牢になります。

  3. Build.Do() メソッドの変更: Build.Do() メソッド内で、godoc のビルドに関するコメントが変更されました。 - // with a slower, race-enabled cmd/go, cmd/godoc, etc. + // with a slower, race-enabled cmd/go, etc. これは、godoc がGo本体のビルドプロセスで -race フラグ付きでビルドされなくなったことを示唆しています。代わりに、新しい godoc() 関数で独立して取得されるため、このコメントが修正されました。 また、b.tour() の呼び出しの前に err = b.godoc() が追加され、godoc の取得とインストールがビルドプロセスに組み込まれました。

  4. 新しい Build.godoc() メソッドの追加: このコミットの最も重要な変更点です。

    • defer ステートメントで、GOPATH ディレクトリ内の bin, pkg, src ディレクトリをクリーンアップする処理が定義されています。これは、go get で一時的にダウンロードされたソースコードやビルド成果物を削除するためのものです。
    • b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", godocPath) を使用して、go get コマンドを実行し、godoc パッケージをダウンロードしてインストールします。go get は、指定されたパスのパッケージを GOPATH にダウンロードし、コマンドの場合は GOROOT/bin または GOPATH/bin に実行可能ファイルをインストールします。
    • cpDir 関数を使用して、go.tools/cmd/godoc/template ディレクトリ内のテンプレートファイルを GOROOT/lib/godoc にコピーします。godoc はこれらのテンプレートを使用してドキュメントをレンダリングするため、これらをGoのディストリビューションに含める必要があります。
  5. Build.tour() メソッドの変更: tourPath が定数になったことに伴い、*tourPath の参照が tourPath に変更されました。これにより、go-tour の取得も定数で指定されたパスから行われるようになります。 また、実行可能ファイルの拡張子を取得する ext() ヘルパー関数が導入され、filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext()) のように使用されるようになりました。これにより、Windows環境での .exe 拡張子の扱いがより汎用的に行われます。

  6. 新しい ext() ヘルパー関数の追加: オペレーティングシステムに基づいて実行可能ファイルの拡張子(Windowsの場合は .exe、それ以外の場合は空文字列)を返すシンプルな関数です。これにより、クロスプラットフォームでの実行可能ファイルのパス構築が簡素化されます。

  7. 新しい Build.hgCmd() ヘルパー関数の追加: Mercurialコマンドを実行するためのヘルパー関数です。--config extensions.codereview=! オプションを自動的に追加します。これは、Mercurialのコードレビュー拡張機能を無効にするための設定であり、ビルドプロセス中に予期せぬ動作を防ぐ目的があると考えられます。

  8. Mercurialコマンドの呼び出しの変更: b.run(work, "hg", "clone", ...)b.run(b.root, "hg", "update", ...) といった直接的な hg コマンドの呼び出しが、新しく追加された b.hgCmd() ヘルパー関数に置き換えられました。これにより、Mercurialコマンドの実行が一元化され、共通のオプションが適用されるようになります。

これらの変更により、Goのディストリビューションビルドプロセスは、godocgo-tour といった外部ツールをよりモジュール的に、かつ効率的に組み込むことができるようになりました。

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

--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -31,7 +31,6 @@ 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")
@@ -44,6 +43,8 @@ var (
 
 const (
 	uploadURL = "https://go.googlecode.com/files"
+	godocPath = "code.google.com/p/go.tools/cmd/godoc"
+	tourPath  = "code.google.com/p/go-tour"
 )
 
 var preBuildCleanFiles = []string{
@@ -173,11 +174,11 @@ func (b *Build) Do() error {
 	b.gopath = work
 
 	// Clone Go distribution and update to tag.
-	_, err = b.run(work, "hg", "clone", "-q", *repo, b.root)
+	_, err = b.hgCmd(work, "clone", *repo, b.root)
 	if err != nil {
 		return err
 	}
-	_, err = b.run(b.root, "hg", "update", *tag)
+	_, err = b.hgCmd(b.root, "update", *tag)
 	if err != nil {
 		return err
 	}
@@ -214,7 +215,7 @@ func (b *Build) Do() error {
 				return err
 			}
 			// Re-install std without -race, so that we're not left
-			// with a slower, race-enabled cmd/go, cmd/godoc, etc.
+			// with a slower, race-enabled cmd/go, etc.
 			_, err = b.run(src, goCmd, "install", "-a", "std")
 			// Re-building go command leaves old versions of go.exe as go.exe~ on windows.
 			// See (*builder).copyFile in $GOROOT/src/cmd/go/build.go for details.
@@ -226,6 +227,10 @@ func (b *Build) Do() error {
 		if err != nil {
 			return err
 		}
+		err = b.godoc()
+		if err != nil {
+			return err
+		}
 		err = b.tour()
 	}
 	if err != nil {
@@ -408,6 +413,28 @@ func (b *Build) Do() error {
 	return err
 }
 
+func (b *Build) godoc() error {
+	defer func() {
+		// Clean work files from GOPATH directory.
+		for _, d := range []string{"bin", "pkg", "src"} {
+			os.RemoveAll(filepath.Join(b.gopath, d))
+		}
+	}()
+
+	// go get the godoc package.
+	// The go tool knows to install to $GOROOT/bin.
+	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", godocPath)
+	if err != nil {
+		return err
+	}
+
+	// Copy templates from go.tools/cmd/godoc/template to GOROOT/lib/godoc.
+	return cpDir(
+		filepath.Join(b.root, "lib", "godoc"),
+		filepath.Join(b.gopath, "src", filepath.FromSlash(godocPath), "template"),
+	)
+}
+
 func (b *Build) tour() error {
 	defer func() {
 		// Clean work files from GOPATH directory.
@@ -417,13 +444,13 @@ func (b *Build) tour() error {
 	}()
 
 	// go get the gotour package.
-	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", *tourPath+"/gotour")
+	_, err := b.run(b.gopath, filepath.Join(b.root, "bin", "go"), "get", tourPath+"/gotour")
 	if err != nil {
 		return err
 	}
 
 	// Copy all the tour content to $GOROOT/misc/tour.
-	importPath := filepath.FromSlash(*tourPath)
+	importPath := filepath.FromSlash(tourPath)
 	tourSrc := filepath.Join(b.gopath, "src", importPath)
 	contentDir := filepath.Join(b.root, "misc", "tour")
 	if err = cpAllDir(contentDir, tourSrc, tourContent...); err != nil {
@@ -436,16 +463,23 @@ func (b *Build) tour() error {
 	}
 
 	// Copy gotour binary to tool directory as "tour"; invoked as "go tool tour".
-	ext := ""
-	if runtime.GOOS == "windows" {
-		ext = ".exe"
-	}
 	return cp(
-		filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext),
-		filepath.Join(b.gopath, "bin", "gotour"+ext),
+		filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext()),
+		filepath.Join(b.gopath, "bin", "gotour"+ext()),
 	)
 }
 
+func ext() string {
+	if runtime.GOOS == "windows" {
+		return ".exe"
+	}
+	return ""
+}
+
+func (b *Build) hgCmd(dir string, args ...string) ([]byte, error) {
+	return b.run(dir, "hg", append([]string{"--config", "extensions.codereview=!"}, args...)...)
+}
+
 func (b *Build) run(dir, name string, args ...string) ([]byte, error) {
 	buf := new(bytes.Buffer)
 	absName, err := lookPath(name)

コアとなるコードの解説

  1. 定数の変更と追加:

    • tourPathflag.String から const に変更され、godocPath が新しく追加されました。これにより、godocgo-tour のソースリポジトリパスがビルドスクリプト内で固定化され、外部からの設定に依存しなくなりました。これは、これらのツールがGoディストリビューションの標準的な一部として扱われることを意味します。
  2. Build.Do() 内での godoc() 呼び出し:

    • b.godoc() の呼び出しが b.tour() の前に挿入されました。これは、Goディストリビューションのビルドプロセスにおいて、godocgo-tour と同様に、Go本体のビルド後に外部から取得・組み込まれるようになったことを示しています。
  3. Build.godoc() 関数の新規追加:

    • この関数は godoc ツールをGoディストリビューションに組み込むためのロジックをカプセル化しています。
    • defer を用いて、go get によって一時的に作成された GOPATH 内の作業ファイルをクリーンアップする処理が記述されています。これにより、ビルド環境が常にクリーンに保たれます。
    • go get コマンド (filepath.Join(b.root, "bin", "go"), "get", godocPath)) を実行し、go.tools リポジトリから godoc を取得し、Goのツールディレクトリにインストールします。
    • cpDir 関数を使って、go.tools/cmd/godoc/template にある godoc のHTMLテンプレートファイルを GOROOT/lib/godoc にコピーします。godoc が正しく機能するためにはこれらのテンプレートが必要です。
  4. Build.tour() 関数の変更:

    • tourPath が定数になったことに伴い、*tourPath の参照が tourPath に変更されました。
    • 実行可能ファイルの拡張子を動的に取得するために、新しく追加された ext() 関数が使用されるようになりました。これにより、Windows環境での .exe 拡張子の扱いがより汎用的になりました。
  5. ext() 関数の新規追加:

    • 現在のOSがWindowsであれば .exe を、そうでなければ空文字列を返すシンプルなヘルパー関数です。これにより、クロスプラットフォームでの実行可能ファイル名の構築が容易になります。
  6. Build.hgCmd() 関数の新規追加と利用:

    • Mercurialコマンドを実行するためのラッパー関数です。この関数は、hg コマンドに常に --config extensions.codereview=! オプションを付加します。これは、ビルドプロセス中にMercurialのコードレビュー拡張機能が干渉しないようにするための設定です。
    • hg clonehg update の呼び出しが、直接 b.run を使う代わりに b.hgCmd を使うように変更されました。これにより、Mercurialコマンドの実行が一元化され、共通の設定が適用されるようになりました。

これらの変更は、Goのビルドシステムが、Go本体と関連ツール(godocgo-tour)の間の依存関係をより明確にし、それぞれのコンポーネントを独立して管理・更新できるようにするための重要なステップを示しています。

関連リンク

参考にした情報源リンク

  • コミット情報: /home/orange/Project/comemo/commit_data/16976.txt
  • GitHub上のコミットページ: https://github.com/golang/go/commit/87380415e0a6634e822d4afbb506eaa74d6acf12
  • Go言語のビルドシステムに関する一般的な知識
  • go get コマンドの動作に関する知識
  • Mercurial (hg) コマンドに関する知識
  • Go言語の環境変数 (GOPATH, GOROOT) に関する知識
  • Go言語のツールエコシステムに関する一般的な知識