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

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

このコミットは、Go言語の配布物(ディストリビューション)をビルドする際に使用されるmisc/dist/bindist.goスクリプトにおけるファイル名の生成ロジックと、デフォルトで使用されるMercurialタグの変更に関するものです。具体的には、生成されるアーカイブファイル名から冗長なgo.プレフィックスを削除し、同時にデフォルトのタグをweeklyからreleaseに変更しています。これにより、ファイル名がより簡潔になり、リリース版のビルドプロセスが効率化されます。

コミット

commit 029d62f5c0c13caae47a9d9ab294fb5dba0884ef
Author: Andrew Gerrand <adg@golang.org>
Date:   Thu Apr 26 13:25:53 2012 -0700

    misc/dist: drop repetition in filenames, default to release tag
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/6117066

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

https://github.com/golang/go/commit/029d62f5c0c13caae47a9d9ab294fb5dba0884ef

元コミット内容

misc/dist: drop repetition in filenames, default to release tag

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6117066

変更の背景

この変更の背景には、Go言語の配布物ビルドプロセスにおけるファイル名の冗長性の解消と、リリース管理の効率化があります。

  1. ファイル名の冗長性: 以前のファイル名生成ロジックでは、go.go.version.os-arch.tar.gzのように、go.というプレフィックスが二重に含まれる可能性がありました。これは視覚的に冗長であり、ファイル管理の観点からも改善の余地がありました。このコミットは、ファイル名が既にgoで始まっている場合に、重複してgo.を追加しないようにすることで、ファイル名をより簡潔にすることを目的としています。
  2. デフォルトタグの変更: Go言語のビルドシステムでは、特定のバージョンや状態を示すためにMercurial(当時Goが使用していたバージョン管理システム)のタグを利用していました。以前はデフォルトでweeklyタグが使用されていましたが、これは開発中のスナップショットを指すことが多かったです。この変更により、デフォルトのタグをreleaseに設定することで、より安定したリリース版のビルドをデフォルトの動作とすることが意図されています。これは、Go言語の成熟に伴い、安定版の配布がより重視されるようになったことを示唆しています。

これらの変更は、Go言語のビルドおよび配布プロセスの使いやすさと効率性を向上させるための、継続的な改善の一環として行われました。

前提知識の解説

このコミットを理解するためには、以下の前提知識が役立ちます。

  1. Go言語のビルドシステム: Go言語は、自身のコンパイラやツールチェインをGo自身で記述しており、そのビルドプロセスは非常に洗練されています。misc/distディレクトリには、Goの配布物を生成するためのスクリプトが含まれており、これらはクロスコンパイルや様々なプラットフォーム向けのパッケージングを管理します。bindist.goはその中でも、バイナリ配布物(tarballなど)の生成を担当する重要なスクリプトです。
  2. Mercurial (Hg): Go言語プロジェクトは、初期には分散型バージョン管理システムであるMercurialを使用していました。Gitと同様に、Mercurialもリポジトリの履歴を管理し、特定の時点をマークするための「タグ」機能を提供します。weeklyreleaseといったタグは、プロジェクトの特定の開発段階や公式リリース版を識別するために使用されます。このコミットが行われた2012年時点では、GoプロジェクトはまだMercurialを主要なバージョン管理システムとして利用していました。
  3. ファイル名命名規則: ソフトウェアの配布物では、ファイル名にバージョン、OS、アーキテクチャなどの情報を含めることが一般的です。これにより、ユーザーはダウンロードしたファイルがどの環境向けのものか、どのバージョンであるかを一目で判断できます。Goの配布物も同様に、go.version.os-arch.tar.gzのような命名規則を採用しています。
  4. fmt.Sprintf: Go言語の標準ライブラリに含まれる関数で、C言語のsprintfに似ています。フォーマット文字列と引数を受け取り、フォーマットされた文字列を生成します。ファイル名の生成によく用いられます。
  5. strings.HasPrefix: Go言語の標準ライブラリに含まれる関数で、ある文字列が特定のプレフィックスで始まるかどうかを判定します。このコミットでは、生成されるファイル名が既にgo.で始まっているかどうかを確認するために使用されています。

技術的詳細

このコミットにおける技術的な変更は、主にmisc/dist/bindist.goファイル内の2つの箇所に集中しています。

  1. デフォルトのMercurialタグの変更:

    • 変更前: tag = flag.String("tag", "weekly", "mercurial tag to check out")
    • 変更後: tag = flag.String("tag", "release", "mercurial tag to check out")
    • これは、コマンドライン引数で-tagオプションが指定されなかった場合のデフォルト値をweeklyからreleaseに変更しています。flag.Stringは、コマンドラインフラグを定義するためのGoの標準ライブラリ関数です。これにより、Goのバイナリ配布物をビルドする際に、明示的にタグを指定しない限り、releaseタグに対応するソースコードがチェックアウトされるようになります。これは、開発者が最新の安定版をビルドすることをデフォルトの挙動としたいという意図を示しています。
  2. 生成されるファイル名のロジック変更:

    • 変更前: base := fmt.Sprintf("go.%s.%s-%s", version, b.OS, b.Arch)
    • 変更後:
      base := fmt.Sprintf("%s.%s-%s", version, b.OS, b.Arch)
      if !strings.HasPrefix(base, "go") {
          base = "go." + base
      }
      
    • この変更は、バイナリ配布物のベースファイル名を生成する部分に適用されています。
      • 以前は、常にgo.プレフィックスを付加していました。例えば、version1.0の場合、go.1.0.linux-amd64のようなファイル名が生成されます。
      • 新しいロジックでは、まずversion.os-arch形式でベース名を生成します。
      • 次に、strings.HasPrefix(base, "go")を使って、生成されたbase文字列が既にgoで始まっているかどうかを確認します。
      • もしgoで始まっていない場合のみ、go.プレフィックスを追加します。
    • 同様の変更が、ソースコード配布物(go.%.src.tar.gz)のファイル名生成ロジックにも適用されています。
      • 変更前: targ = fmt.Sprintf("go.%s.src", version)
      • 変更後:
        targ = fmt.Sprintf("%s.src", version)
        if !strings.HasPrefix(targ, "go") {
            targ = "go." + targ
        }
        
    • この変更の目的は、ファイル名におけるgo.の重複を避けることです。例えば、versiongo1.0のような形式である場合、以前のロジックではgo.go1.0.linux-amd64となっていましたが、この変更によりgo1.0.linux-amd64のように簡潔なファイル名が生成されるようになります。これにより、ファイル名がよりクリーンで読みやすくなります。

これらの変更は、Goのビルドスクリプトの堅牢性を高め、生成される成果物の命名規則をより一貫性のあるものにするための改善です。

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

diff --git a/misc/dist/bindist.go b/misc/dist/bindist.go
index b623449a4e..891397635b 100644
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -29,7 +29,7 @@ import (
 )
 
 var (
-	tag      = flag.String("tag", "weekly", "mercurial tag to check out")
+	tag      = flag.String("tag", "release", "mercurial tag to check out")
 	repo     = flag.String("repo", "https://code.google.com/p/go", "repo URL")
 	verbose  = flag.Bool("v", false, "verbose output")
 	upload   = flag.Bool("upload", true, "upload resulting files to Google Code")
@@ -209,14 +209,20 @@ func (b *Build) Do() error {
 	}
 
 	// Create packages.
-	base := fmt.Sprintf("go.%s.%s-%s", version, b.OS, b.Arch)
+	base := fmt.Sprintf("%s.%s-%s", version, b.OS, b.Arch)
+	if !strings.HasPrefix(base, "go") {
+		base = "go." + base
+	}
 	var targs []string
 	switch b.OS {
 	case "linux", "freebsd", "":
 		// build tarball
 		targ := base
 		if b.Source {
-			targ = fmt.Sprintf("go.%s.src", version)
+			targ = fmt.Sprintf("%s.src", version)
+			if !strings.HasPrefix(targ, "go") {
+				targ = "go." + targ
+			}
 		}
 		targ += ".tar.gz"
 		err = makeTar(targ, work)

コアとなるコードの解説

上記のdiffは、misc/dist/bindist.goファイルに対する変更を示しています。

  1. tag変数のデフォルト値変更:

    -	tag      = flag.String("tag", "weekly", "mercurial tag to check out")
    +	tag      = flag.String("tag", "release", "mercurial tag to check out")
    

    この行は、Goのソースコードをチェックアウトする際に使用されるMercurialタグのデフォルト値を変更しています。以前はweekly(週次スナップショット)がデフォルトでしたが、この変更によりrelease(安定版リリース)がデフォルトとなりました。これにより、ビルドスクリプトを実行する際に明示的にタグを指定しない場合、より安定したリリース版のGoがビルドされるようになります。

  2. バイナリ配布物ファイル名の生成ロジック変更:

    -	base := fmt.Sprintf("go.%s.%s-%s", version, b.OS, b.Arch)
    +	base := fmt.Sprintf("%s.%s-%s", version, b.OS, b.Arch)
    +	if !strings.HasPrefix(base, "go") {
    +		base = "go." + base
    +	}
    

    このセクションは、Goのバイナリ配布物(例: go1.0.linux-amd64.tar.gz)のベースファイル名を生成する部分です。

    • 変更前は、常にgo.プレフィックスをversionOSArchの前に付加していました。
    • 変更後は、まずversion.OS-Archの形式でベース名を生成します。
    • その後にif !strings.HasPrefix(base, "go")という条件文が追加されています。これは、生成されたbase文字列が既にgoで始まっていない場合にのみ、go.プレフィックスを追加するという意味です。
    • このロジックにより、例えばversiongo1.0のような形式の場合、以前はgo.go1.0.linux-amd64となっていたファイル名が、go1.0.linux-amd64のように冗長なgo.が削除され、より簡潔になります。
  3. ソースコード配布物ファイル名の生成ロジック変更:

    -			targ = fmt.Sprintf("go.%s.src", version)
    +			targ = fmt.Sprintf("%s.src", version)
    +			if !strings.HasPrefix(targ, "go") {
    +				targ = "go." + targ
    +			}
    

    このセクションは、Goのソースコード配布物(例: go1.0.src.tar.gz)のファイル名を生成する部分です。

    • この変更も、バイナリ配布物のファイル名変更と同様の意図を持っています。
    • 以前は、常にgo.プレフィックスをversion.srcの前に付加していました。
    • 変更後は、まずversion.srcの形式でターゲット名を生成します。
    • そして、if !strings.HasPrefix(targ, "go")という条件文で、生成されたtarg文字列が既にgoで始まっていない場合にのみ、go.プレフィックスを追加します。
    • これにより、ソースコード配布物のファイル名も、versiongo1.0のような形式の場合に冗長なgo.が削除され、簡潔になります。

これらの変更は、Goのビルドシステムが生成する成果物の命名規則をよりスマートにし、デフォルトのビルドターゲットを安定版にシフトさせることで、開発者とユーザー双方にとっての利便性を向上させています。

関連リンク

参考にした情報源リンク