[インデックス 16976] ファイルの概要
このコミットは、Go言語のディストリビューションビルドプロセスを管理する misc/dist/bindist.go
ファイルに対する変更です。このファイルは、Goの公式バイナリディストリビューションを生成する際に、Go本体のリポジトリだけでなく、go.tools
や go-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 vet
、goimports
、gorename
、そして godoc
といった、Go言語の開発を支援する様々なツールを集約するために作成されました。これらのツールを go.tools
に移行することで、以下のメリットが生まれます。
- 独立した開発とリリースサイクル:
godoc
のようなツールは、Go言語のリリースサイクルに縛られずに、独立して機能追加やバグ修正を行うことができるようになります。 - 依存関係の明確化: Go本体のビルドプロセスから
godoc
のビルドを分離することで、Go本体のビルドに必要な依存関係がより明確になります。 - ビルド時間の短縮: Go本体のビルド時に
godoc
をビルドする必要がなくなるため、全体のビルド時間が短縮される可能性があります。 - ツールの管理の簡素化: ユーザーは
go get
コマンドを使ってgo.tools
から最新のツールを簡単に取得できるようになります。
このコミットは、godoc
を go.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
内で変更したことです。
-
godocPath
定数の追加:const godocPath = "code.google.com/p/go.tools/cmd/godoc"
が追加されました。これにより、godoc
のインポートパスが明示的に定義され、go.tools
リポジトリ内のgodoc
コマンドを指すようになります。 -
tourPath
の定数化:tourPath
も同様にflag.String
から定数const tourPath = "code.google.com/p/go-tour"
に変更されました。これにより、go-tour
のリポジトリパスも固定化され、ビルドプロセスがより堅牢になります。 -
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
の取得とインストールがビルドプロセスに組み込まれました。 -
新しい
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のディストリビューションに含める必要があります。
-
Build.tour()
メソッドの変更:tourPath
が定数になったことに伴い、*tourPath
の参照がtourPath
に変更されました。これにより、go-tour
の取得も定数で指定されたパスから行われるようになります。 また、実行可能ファイルの拡張子を取得するext()
ヘルパー関数が導入され、filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext())
のように使用されるようになりました。これにより、Windows環境での.exe
拡張子の扱いがより汎用的に行われます。 -
新しい
ext()
ヘルパー関数の追加: オペレーティングシステムに基づいて実行可能ファイルの拡張子(Windowsの場合は.exe
、それ以外の場合は空文字列)を返すシンプルな関数です。これにより、クロスプラットフォームでの実行可能ファイルのパス構築が簡素化されます。 -
新しい
Build.hgCmd()
ヘルパー関数の追加: Mercurialコマンドを実行するためのヘルパー関数です。--config extensions.codereview=!
オプションを自動的に追加します。これは、Mercurialのコードレビュー拡張機能を無効にするための設定であり、ビルドプロセス中に予期せぬ動作を防ぐ目的があると考えられます。 -
Mercurialコマンドの呼び出しの変更:
b.run(work, "hg", "clone", ...)
やb.run(b.root, "hg", "update", ...)
といった直接的なhg
コマンドの呼び出しが、新しく追加されたb.hgCmd()
ヘルパー関数に置き換えられました。これにより、Mercurialコマンドの実行が一元化され、共通のオプションが適用されるようになります。
これらの変更により、Goのディストリビューションビルドプロセスは、godoc
や go-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)
コアとなるコードの解説
-
定数の変更と追加:
tourPath
がflag.String
からconst
に変更され、godocPath
が新しく追加されました。これにより、godoc
とgo-tour
のソースリポジトリパスがビルドスクリプト内で固定化され、外部からの設定に依存しなくなりました。これは、これらのツールがGoディストリビューションの標準的な一部として扱われることを意味します。
-
Build.Do()
内でのgodoc()
呼び出し:b.godoc()
の呼び出しがb.tour()
の前に挿入されました。これは、Goディストリビューションのビルドプロセスにおいて、godoc
がgo-tour
と同様に、Go本体のビルド後に外部から取得・組み込まれるようになったことを示しています。
-
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
が正しく機能するためにはこれらのテンプレートが必要です。
- この関数は
-
Build.tour()
関数の変更:tourPath
が定数になったことに伴い、*tourPath
の参照がtourPath
に変更されました。- 実行可能ファイルの拡張子を動的に取得するために、新しく追加された
ext()
関数が使用されるようになりました。これにより、Windows環境での.exe
拡張子の扱いがより汎用的になりました。
-
ext()
関数の新規追加:- 現在のOSがWindowsであれば
.exe
を、そうでなければ空文字列を返すシンプルなヘルパー関数です。これにより、クロスプラットフォームでの実行可能ファイル名の構築が容易になります。
- 現在のOSがWindowsであれば
-
Build.hgCmd()
関数の新規追加と利用:- Mercurialコマンドを実行するためのラッパー関数です。この関数は、
hg
コマンドに常に--config extensions.codereview=!
オプションを付加します。これは、ビルドプロセス中にMercurialのコードレビュー拡張機能が干渉しないようにするための設定です。 hg clone
とhg update
の呼び出しが、直接b.run
を使う代わりにb.hgCmd
を使うように変更されました。これにより、Mercurialコマンドの実行が一元化され、共通の設定が適用されるようになりました。
- Mercurialコマンドを実行するためのラッパー関数です。この関数は、
これらの変更は、Goのビルドシステムが、Go本体と関連ツール(godoc
、go-tour
)の間の依存関係をより明確にし、それぞれのコンポーネントを独立して管理・更新できるようにするための重要なステップを示しています。
関連リンク
- Go言語公式サイト: https://golang.org/
- Go Tools リポジトリ: https://go.googlesource.com/tools (現在のGitリポジトリ)
- コミット当時のMercurialリポジトリ:
code.google.com/p/go.tools
- コミット当時のMercurialリポジトリ:
- Go Tour リポジトリ: https://go.googlesource.com/tour (現在のGitリポジトリ)
- コミット当時のMercurialリポジトリ:
code.google.com/p/go-tour
- コミット当時のMercurialリポジトリ:
godoc
コマンドのドキュメント: https://pkg.go.dev/cmd/godoc
参考にした情報源リンク
- コミット情報:
/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.tools
や go-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 vet
、goimports
、gorename
、そして godoc
といった、Go言語の開発を支援する様々なツールを集約するために作成されました。これらのツールを go.tools
に移行することで、以下のメリットが生まれます。
- 独立した開発とリリースサイクル:
godoc
のようなツールは、Go言語のリリースサイクルに縛られずに、独立して機能追加やバグ修正を行うことができるようになります。 - 依存関係の明確化: Go本体のビルドプロセスから
godoc
のビルドを分離することで、Go本体のビルドに必要な依存関係がより明確になります。 - ビルド時間の短縮: Go本体のビルド時に
godoc
をビルドする必要がなくなるため、全体のビルド時間が短縮される可能性があります。 - ツールの管理の簡素化: ユーザーは
go get
コマンドを使ってgo.tools
から最新のツールを簡単に取得できるようになります。
このコミットは、godoc
を go.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
内で変更したことです。
-
godocPath
定数の追加:const godocPath = "code.google.com/p/go.tools/cmd/godoc"
が追加されました。これにより、godoc
のインポートパスが明示的に定義され、go.tools
リポジトリ内のgodoc
コマンドを指すようになります。 -
tourPath
の定数化:tourPath
も同様にflag.String
から定数const tourPath = "code.google.com/p/go-tour"
に変更されました。これにより、go-tour
のリポジトリパスも固定化され、ビルドプロセスがより堅牢になります。 -
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
の取得とインストールがビルドプロセスに組み込まれました。 -
新しい
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のディストリビューションに含める必要があります。
-
Build.tour()
メソッドの変更:tourPath
が定数になったことに伴い、*tourPath
の参照がtourPath
に変更されました。これにより、go-tour
の取得も定数で指定されたパスから行われるようになります。 また、実行可能ファイルの拡張子を取得するext()
ヘルパー関数が導入され、filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext())
のように使用されるようになりました。これにより、Windows環境での.exe
拡張子の扱いがより汎用的に行われます。 -
新しい
ext()
ヘルパー関数の追加: オペレーティングシステムに基づいて実行可能ファイルの拡張子(Windowsの場合は.exe
、それ以外の場合は空文字列)を返すシンプルな関数です。これにより、クロスプラットフォームでの実行可能ファイルのパス構築が簡素化されます。 -
新しい
Build.hgCmd()
ヘルパー関数の追加: Mercurialコマンドを実行するためのヘルパー関数です。--config extensions.codereview=!
オプションを自動的に追加します。これは、Mercurialのコードレビュー拡張機能を無効にするための設定であり、ビルドプロセス中に予期せぬ動作を防ぐ目的があると考えられます。 -
Mercurialコマンドの呼び出しの変更:
b.run(work, "hg", "clone", ...)
やb.run(b.root, "hg", "update", ...)
といった直接的なhg
コマンドの呼び出しが、新しく追加されたb.hgCmd()
ヘルパー関数に置き換えられました。これにより、Mercurialコマンドの実行が一元化され、共通のオプションが適用されるようになります。
これらの変更により、Goのディストリビューションビルドプロセスは、godoc
や go-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)
コアとなるコードの解説
-
定数の変更と追加:
tourPath
がflag.String
からconst
に変更され、godocPath
が新しく追加されました。これにより、godoc
とgo-tour
のソースリポジトリパスがビルドスクリプト内で固定化され、外部からの設定に依存しなくなりました。これは、これらのツールがGoディストリビューションの標準的な一部として扱われることを意味します。
-
Build.Do()
内でのgodoc()
呼び出し:b.godoc()
の呼び出しがb.tour()
の前に挿入されました。これは、Goディストリビューションのビルドプロセスにおいて、godoc
がgo-tour
と同様に、Go本体のビルド後に外部から取得・組み込まれるようになったことを示しています。
-
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
が正しく機能するためにはこれらのテンプレートが必要です。
- この関数は
-
Build.tour()
関数の変更:tourPath
が定数になったことに伴い、*tourPath
の参照がtourPath
に変更されました。- 実行可能ファイルの拡張子を動的に取得するために、新しく追加された
ext()
関数が使用されるようになりました。これにより、Windows環境での.exe
拡張子の扱いがより汎用的になりました。
-
ext()
関数の新規追加:- 現在のOSがWindowsであれば
.exe
を、そうでなければ空文字列を返すシンプルなヘルパー関数です。これにより、クロスプラットフォームでの実行可能ファイル名の構築が容易になります。
- 現在のOSがWindowsであれば
-
Build.hgCmd()
関数の新規追加と利用:- Mercurialコマンドを実行するためのラッパー関数です。この関数は、
hg
コマンドに常に--config extensions.codereview=!
オプションを付加します。これは、ビルドプロセス中にMercurialのコードレビュー拡張機能が干渉しないようにするための設定です。 hg clone
とhg update
の呼び出しが、直接b.run
を使う代わりにb.hgCmd
を使うように変更されました。これにより、Mercurialコマンドの実行が一元化され、共通の設定が適用されるようになりました。
- Mercurialコマンドを実行するためのラッパー関数です。この関数は、
これらの変更は、Goのビルドシステムが、Go本体と関連ツール(godoc
、go-tour
)の間の依存関係をより明確にし、それぞれのコンポーネントを独立して管理・更新できるようにするための重要なステップを示しています。
関連リンク
- Go言語公式サイト: https://golang.org/
- Go Tools リポジトリ: https://go.googlesource.com/tools (現在のGitリポジトリ)
- コミット当時のMercurialリポジトリ:
code.google.com/p/go.tools
- コミット当時のMercurialリポジトリ:
- Go Tour リポジトリ: https://go.googlesource.com/tour (現在のGitリポジトリ)
- コミット当時のMercurialリポジトリ:
code.google.com/p/go-tour
- コミット当時のMercurialリポジトリ:
godoc
コマンドのドキュメント: https://pkg.go.dev/cmd/godoc
参考にした情報源リンク
- コミット情報:
/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言語のツールエコシステムに関する一般的な知識