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

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

このコミットは、Go言語の配布ツール (misc/dist) における変更を記録しています。具体的には、バイナリ配布物をビルドする前に、exp および old パッケージを削除する処理が追加されました。これにより、ビルドプロセスがクリーンアップされ、配布物に含まれる不要なファイルが削減されます。

コミット

commit 5c8e88d6d29569e90cc9abcb9a1677d935b2e8c0
Author: Andrew Gerrand <adg@golang.org>
Date:   Wed Mar 14 23:47:34 2012 +1100

    misc/dist: remove exp and old before building
    
    Fixes #3317.
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5784074

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

https://github.com/golang/go/commit/5c8e88d6d29569e90cc9abcb9a1677d935b2e8c0

元コミット内容

misc/dist: remove exp and old before building

Fixes #3317.

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/5784074

変更の背景

この変更は、Go言語のバイナリ配布物(bindist)を生成する際のビルドプロセスを改善するために行われました。コミットメッセージに「Fixes #3317」とあるように、GoのIssueトラッカーで報告された問題 #3317 を解決することを目的としています。

Goプロジェクトでは、exp(experimental: 実験的)および old(古い)というディレクトリが src/pkg 以下に存在していました。exp ディレクトリには、将来的に標準ライブラリに組み込まれる可能性のある、まだ安定していない実験的なパッケージが含まれていました。一方、old ディレクトリには、もはや推奨されないか、別のパッケージに置き換えられた古いパッケージが含まれていました。

これらのディレクトリは開発目的では有用でしたが、最終的なバイナリ配布物には不要であり、配布物のサイズを不必要に増加させたり、ユーザーに混乱を与えたりする可能性がありました。したがって、配布物の品質と効率性を向上させるために、ビルド前にこれらの不要なパッケージをクリーンアップするメカニズムが必要とされました。

前提知識の解説

Go言語のソースツリーとパッケージ構造

Go言語のソースコードは、特定のディレクトリ構造に従って配置されています。主要なディレクトリは以下の通りです。

  • src/: Goのソースコードが格納されるルートディレクトリです。
    • src/cmd/: Goツールチェインのコマンド(goコマンド自体、gofmtなど)のソースコードが含まれます。
    • src/pkg/: Goの標準ライブラリパッケージのソースコードが含まれます。このコミットの文脈では、src/pkg/expsrc/pkg/old が関連します。
      • src/pkg/exp/: 実験的なパッケージが一時的に置かれる場所でした。これらのパッケージは、まだAPIが安定しておらず、将来的に変更される可能性があります。Go 1.0リリース後、exp ディレクトリは廃止され、実験的なパッケージは通常、golang.org/x/ 配下の独立したリポジトリで開発されるようになりました。
      • src/pkg/old/: 過去に存在したが、現在は非推奨または置き換えられたパッケージが置かれる場所でした。これもGo 1.0リリース後に廃止されました。
    • src/runtime/: Goランタイムのソースコードが含まれます。

misc/distbindist.go

misc/dist ディレクトリは、Goの配布物(ディストリビューション)を構築するためのユーティリティスクリプトやツールが含まれる場所です。このディレクトリ内の bindist.go ファイルは、Goのバイナリ配布物を作成するプロセスを管理するGoプログラムです。これは、Goのソースコードからコンパイルされた実行可能ファイルやライブラリを、ユーザーが利用できる形式でパッケージ化する役割を担っています。

bindist.go は、ビルド、テスト、パッケージング、クリーンアップなど、配布物作成の様々な段階を自動化します。このコミットは、そのクリーンアップ段階に新しいステップを追加するものです。

Goのビルドプロセス

Goのビルドプロセスは、ソースコードをコンパイルして実行可能ファイルやライブラリを生成する一連のステップです。一般的なGoのビルドプロセスには以下のような段階が含まれます。

  1. ソースコードの取得: 必要なGoのソースコードや依存関係を取得します。
  2. 環境設定: ビルドに必要な環境変数(GOROOT, GOPATHなど)を設定します。
  3. コンパイル: Goコンパイラ(go tool compile)を使用して、Goのソースファイルをオブジェクトファイルにコンパイルします。
  4. リンク: オブジェクトファイルをリンカ(go tool link)で結合し、実行可能ファイルや共有ライブラリを生成します。
  5. テスト: 必要に応じて、生成されたバイナリやライブラリのテストを実行します。
  6. クリーンアップ: ビルドプロセス中に生成された一時ファイルや不要なファイルを削除します。このコミットは、このクリーンアップ段階に焦点を当てています。

技術的詳細

このコミットは、misc/dist/bindist.go ファイルに新しいクリーンアップステップを導入することで、Goのバイナリ配布物から不要な exp および old パッケージを除外します。

具体的には、以下の変更が行われました。

  1. preBuildCleanFiles 変数の追加: bindist.go の定数定義の直後に、preBuildCleanFiles という新しい文字列スライス変数が追加されました。このスライスには、ビルド前に削除すべきファイルのパスがリストされています。

    var preBuildCleanFiles = []string{
    	"src/pkg/exp",
    	"src/pkg/old",
    }
    

    この変数は、src/pkg/expsrc/pkg/old という2つのパスを含んでいます。これらは、Goのソースツリーにおける実験的パッケージと古いパッケージのディレクトリを指します。

  2. ビルド前のクリーンアップ処理の追加: Build 構造体の Do() メソッド内に、新しいクリーンアップ処理が追加されました。この処理は、実際のビルドが開始される前に実行されます。

    	// Remove exp and old packages.
    	if err := b.clean(preBuildCleanFiles); err != nil {
    		return err
    	}
    

    ここで、b.clean() メソッドが呼び出され、引数として新しく定義された preBuildCleanFiles が渡されています。b.clean() メソッドは、指定されたパスのファイルやディレクトリを削除する役割を担っています。これにより、exp および old ディレクトリがビルドプロセスに影響を与える前に削除されることが保証されます。エラーが発生した場合は、そのエラーが返され、ビルドプロセスは中断されます。

この変更により、Goのバイナリ配布物には、開発中にのみ必要な exp および old パッケージが含まれなくなり、配布物のサイズが最適化され、配布物の内容がよりクリーンになります。これは、Goのリリースプロセスにおける品質管理の一環として非常に重要です。

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

変更は misc/dist/bindist.go ファイルに集中しています。

--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -42,6 +42,11 @@ const (
 	uploadURL    = "https://go.googlecode.com/files"
 )
 
+var preBuildCleanFiles = []string{
+	"src/pkg/exp",
+	"src/pkg/old",
+}
+
 var cleanFiles = []string{
 	".hg",
 	".hgtags",
@@ -117,6 +122,11 @@ func (b *Build) Do() error {
 		return err
 	}
 
+	// Remove exp and old packages.
+	if err := b.clean(preBuildCleanFiles); err != nil {
+		return err
+	}
+
 	src := filepath.Join(b.root, "src")
 	if b.Source {
 		if runtime.GOOS == "windows" {

コアとなるコードの解説

var preBuildCleanFiles = []string{...}

このコードブロックは、preBuildCleanFiles という名前のグローバル変数(またはパッケージレベル変数)を宣言し、初期化しています。これは文字列のスライス(Goにおける動的配列)であり、ビルド前にクリーンアップ(削除)すべきファイルやディレクトリのパスを保持します。

  • "src/pkg/exp": Goのソースツリー内の実験的パッケージが置かれていたディレクトリへのパスです。
  • "src/pkg/old": Goのソースツリー内の古い(非推奨の)パッケージが置かれていたディレクトリへのパスです。

これらのパスは、Goのルートディレクトリからの相対パスとして指定されています。

if err := b.clean(preBuildCleanFiles); err != nil { ... }

このコードブロックは、Build 構造体のメソッドである Do() の中に挿入されています。Do() メソッドは、Goのバイナリ配布物を構築する主要なロジックを含んでいます。

  • b.clean(preBuildCleanFiles): bBuild 構造体のインスタンスであり、その clean メソッドが呼び出されています。clean メソッドは、引数として渡された文字列スライス(この場合は preBuildCleanFiles)に含まれるすべてのパスに対応するファイルやディレクトリを削除する責任を負います。この操作は、Goのビルドが開始される前に行われます。
  • if err := ...; err != nil { return err }: これはGoにおける典型的なエラーハンドリングパターンです。b.clean() メソッドがエラーを返した場合(例えば、ファイルの削除に失敗した場合)、そのエラーが直ちに呼び出し元に返され、Do() メソッドの実行は中断されます。これにより、クリーンアップが正常に完了しない限り、ビルドプロセスが続行されないことが保証されます。

この変更により、Goのバイナリ配布物には、開発時にのみ必要な exp および old パッケージが含まれなくなり、配布物のサイズが最適化され、配布物の内容がよりクリーンになります。これは、Goのリリースプロセスにおける品質管理の一環として非常に重要です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goのパッケージ構造やビルドプロセスに関する一般的な情報)
  • Goのソースコードリポジトリ (特に misc/dist ディレクトリの内容)
  • GoのIssueトラッカー (Issue #3317の詳細)
  • GoのCode Reviewシステム (CL 5784074の詳細)
  • Go 1.0リリースノート (exp および old ディレクトリの廃止に関する情報)
  • Goの歴史に関する記事やブログポスト (Goの初期のパッケージ管理やディレクトリ構造の変遷について)