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

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

このコミットは、Go言語のソースツリー内の misc/dist/bindist.go ファイルに対する変更です。bindist.go は、Goのバイナリディストリビューション、特にmacOS向けのパッケージ(.pkgファイル)を構築するためのロジックを含んでいます。このファイルは、Goのリリースプロセスにおいて、特定のプラットフォーム向けのインストーラーを作成する際に使用されるツールの一部です。

コミット

このコミットは、macOS向けのGoバイナリパッケージを作成する際に使用される pkgbuild コマンドの --version 引数に渡される値を、ハードコードされた "1.0" から動的な version 変数に変更します。これにより、Goのパッケージバージョンが、ビルドされているGoの実際のバージョンと一致するようになります。

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

https://github.com/golang/go/commit/b6866f1945dc385fe08ec77899659f81a5f0221a

元コミット内容

commit b6866f1945dc385fe08ec77899659f81a5f0221a
Author: Emil Hessman <c.emil.hessman@gmail.com>
Date:   Mon Sep 9 09:36:39 2013 +1000

    misc/dist: Specify a version for the darwin package.
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/13383045

変更の背景

Go言語のバイナリディストリビューションは、様々なオペレーティングシステム向けに提供されています。macOSの場合、標準的なインストール形式は .pkg ファイルです。この .pkg ファイルは、macOSのインストーラーフレームワークによって管理され、インストールされるソフトウェアのバージョン情報を含んでいます。

以前の実装では、GoのmacOS向けパッケージを作成する際に、pkgbuild コマンドに渡されるバージョンが "1.0" とハードコードされていました。これは、Goのバージョンが上がるにつれて、パッケージのバージョンが実際のGoのバージョンと一致しないという問題を引き起こします。例えば、Go 1.1やGo 1.2がリリースされても、生成されるパッケージのバージョンは常に "1.0" と表示されてしまうため、ユーザーがインストールされているGoのバージョンを正確に把握することが困難になります。

このコミットの目的は、このバージョン情報の不一致を解消し、生成されるmacOSパッケージのバージョンが、ビルドされているGoの実際のバージョン(例: Go 1.1、Go 1.2など)を正確に反映するようにすることです。これにより、ユーザーはより正確なバージョン情報を得ることができ、システム管理やGoのバージョン管理が容易になります。

前提知識の解説

1. Go言語のディストリビューションとビルドプロセス

Go言語は、そのソースコードから様々なプラットフォーム向けのバイナリをビルドできるクロスコンパイル機能を備えています。公式のGoディストリビューションは、特定のOSとアーキテクチャ(例: go1.x.y.darwin-amd64.pkg)向けに事前にビルドされたバイナリパッケージとして提供されます。これらのパッケージは、Goのソースツリー内の misc/dist ディレクトリにあるスクリプトやツールを使用して作成されます。misc/dist/bindist.go は、このディストリビューションビルドプロセスの一部であり、特にmacOS向けのパッケージ作成を担当しています。

2. macOSのパッケージ(.pkg)と pkgbuild コマンド

macOSでは、アプリケーションやシステムコンポーネントのインストールには、通常 .pkg 形式のインストーラーパッケージが使用されます。これらのパッケージは、ソフトウェアのファイル、インストールスクリプト、メタデータ(バージョン情報、識別子など)を含んでいます。

pkgbuild は、macOSのコマンドラインツールであり、開発者が .pkg ファイルを作成するために使用します。このコマンドは、インストールするファイルのルートディレクトリ、パッケージの識別子、バージョン、スクリプト、出力パスなど、様々な引数を取ります。

  • --identifier: パッケージの一意な識別子を指定します(例: com.googlecode.go)。
  • --version: パッケージのバージョンを指定します。このコミットの変更点はこの引数に関連します。
  • --scripts: インストール前後に実行されるスクリプトを含むディレクトリを指定します。
  • --root: パッケージに含めるファイルのルートディレクトリを指定します。
  • 最後の引数: 生成される .pkg ファイルの出力パスを指定します。

3. runtime.GOROOT()

runtime.GOROOT() は、Goの標準ライブラリ runtime パッケージで提供される関数です。この関数は、現在実行中のGoのインストールルートディレクトリのパスを返します。Goのビルドシステムやツールは、この GOROOT を利用して、Goの標準ライブラリやツール、その他の関連ファイルを見つけます。このコミットでは、misc/dist ディレクトリへのパスを構築するために使用されています。

技術的詳細

このコミットの技術的な核心は、macOSのパッケージ作成ツールである pkgbuild--version 引数に渡す値の変更にあります。

pkgbuild コマンドは、macOSのインストーラーパッケージ(.pkg)を作成するための重要なツールです。このコマンドは、パッケージのメタデータの一部としてバージョン情報を埋め込むことができます。以前のコードでは、このバージョン情報が pkgbuild コマンドの引数として "1.0" と直接文字列リテラルで指定されていました。

// 変更前
_, err = b.run("", "pkgbuild",
    "--identifier", "com.googlecode.go",
    "--version", "1.0", // ここがハードコードされていた
    "--scripts", filepath.Join(dist, "darwin/scripts"),
    "--root", work,
    filepath.Join(pkgdest, "com.googlecode.go.pkg"))

このハードコードされた値は、Goのバージョンが更新されてもパッケージのバージョンが常に "1.0" のままであるという問題を引き起こしていました。

今回の変更では、この "1.0" という文字列リテラルが version という変数に置き換えられました。

// 変更後
_, err = b.run("", "pkgbuild",
    "--identifier", "com.googlecode.go",
    "--version", version, // version 変数を使用
    "--scripts", filepath.Join(dist, "darwin/scripts"),
    "--root", work,
    filepath.Join(pkgdest, "com.googlecode.go.pkg"))

この version 変数は、bindist.go の他の部分で、現在ビルドされているGoの実際のバージョン(例: "go1.1", "go1.2" など)を取得して設定されていると推測されます。これにより、pkgbuild が生成する .pkg ファイルには、Goの実際のバージョンが正確に反映されるようになります。

この変更は、Goのディストリビューションの品質とユーザーエクスペリエンスを向上させるための小さな、しかし重要な改善です。バージョン管理の正確性は、ソフトウェアの配布において非常に重要であり、この修正はその正確性を保証します。

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

--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -327,7 +327,7 @@ func (b *Build) Do() error {
 		dist := filepath.Join(runtime.GOROOT(), "misc/dist")
 		_, err = b.run("", "pkgbuild",
 			"--identifier", "com.googlecode.go",
-			"--version", "1.0",
+			"--version", version,
 			"--scripts", filepath.Join(dist, "darwin/scripts"),
 			"--root", work,
 			filepath.Join(pkgdest, "com.googlecode.go.pkg"))

コアとなるコードの解説

変更は misc/dist/bindist.go ファイルの Do() メソッド内で行われています。このメソッドは、Goのバイナリディストリビューションを構築する主要なロジックを含んでいます。

具体的には、pkgbuild コマンドを呼び出す部分で、--version 引数に渡す値が変更されました。

  • 変更前: --version", "1.0"
    • これは、pkgbuild コマンドにパッケージのバージョンとして常に文字列 "1.0" を渡していました。Goのバージョンが何であっても、生成されるmacOSパッケージのバージョンは "1.0" となります。
  • 変更後: --version", version
    • これは、pkgbuild コマンドに version という名前の変数の値を渡します。この version 変数は、bindist.go の他の場所で、現在ビルドされているGoの実際のバージョン(例: "go1.1", "go1.2" など)が動的に設定されていると想定されます。これにより、生成されるmacOSパッケージのバージョンが、Goの実際のバージョンと一致するようになります。

この変更により、macOSユーザーがGoをインストールする際に、インストーラーが示すバージョン情報がGoの実際のバージョンと同期されるようになり、より正確な情報が提供されるようになります。

関連リンク

参考にした情報源リンク