[インデックス 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言語の配布物ビルドプロセスにおけるファイル名の冗長性の解消と、リリース管理の効率化があります。
- ファイル名の冗長性: 以前のファイル名生成ロジックでは、
go.go.version.os-arch.tar.gz
のように、go.
というプレフィックスが二重に含まれる可能性がありました。これは視覚的に冗長であり、ファイル管理の観点からも改善の余地がありました。このコミットは、ファイル名が既にgo
で始まっている場合に、重複してgo.
を追加しないようにすることで、ファイル名をより簡潔にすることを目的としています。 - デフォルトタグの変更: Go言語のビルドシステムでは、特定のバージョンや状態を示すためにMercurial(当時Goが使用していたバージョン管理システム)のタグを利用していました。以前はデフォルトで
weekly
タグが使用されていましたが、これは開発中のスナップショットを指すことが多かったです。この変更により、デフォルトのタグをrelease
に設定することで、より安定したリリース版のビルドをデフォルトの動作とすることが意図されています。これは、Go言語の成熟に伴い、安定版の配布がより重視されるようになったことを示唆しています。
これらの変更は、Go言語のビルドおよび配布プロセスの使いやすさと効率性を向上させるための、継続的な改善の一環として行われました。
前提知識の解説
このコミットを理解するためには、以下の前提知識が役立ちます。
- Go言語のビルドシステム: Go言語は、自身のコンパイラやツールチェインをGo自身で記述しており、そのビルドプロセスは非常に洗練されています。
misc/dist
ディレクトリには、Goの配布物を生成するためのスクリプトが含まれており、これらはクロスコンパイルや様々なプラットフォーム向けのパッケージングを管理します。bindist.go
はその中でも、バイナリ配布物(tarballなど)の生成を担当する重要なスクリプトです。 - Mercurial (Hg): Go言語プロジェクトは、初期には分散型バージョン管理システムであるMercurialを使用していました。Gitと同様に、Mercurialもリポジトリの履歴を管理し、特定の時点をマークするための「タグ」機能を提供します。
weekly
やrelease
といったタグは、プロジェクトの特定の開発段階や公式リリース版を識別するために使用されます。このコミットが行われた2012年時点では、GoプロジェクトはまだMercurialを主要なバージョン管理システムとして利用していました。 - ファイル名命名規則: ソフトウェアの配布物では、ファイル名にバージョン、OS、アーキテクチャなどの情報を含めることが一般的です。これにより、ユーザーはダウンロードしたファイルがどの環境向けのものか、どのバージョンであるかを一目で判断できます。Goの配布物も同様に、
go.version.os-arch.tar.gz
のような命名規則を採用しています。 fmt.Sprintf
: Go言語の標準ライブラリに含まれる関数で、C言語のsprintf
に似ています。フォーマット文字列と引数を受け取り、フォーマットされた文字列を生成します。ファイル名の生成によく用いられます。strings.HasPrefix
: Go言語の標準ライブラリに含まれる関数で、ある文字列が特定のプレフィックスで始まるかどうかを判定します。このコミットでは、生成されるファイル名が既にgo.
で始まっているかどうかを確認するために使用されています。
技術的詳細
このコミットにおける技術的な変更は、主にmisc/dist/bindist.go
ファイル内の2つの箇所に集中しています。
-
デフォルトの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
タグに対応するソースコードがチェックアウトされるようになります。これは、開発者が最新の安定版をビルドすることをデフォルトの挙動としたいという意図を示しています。
- 変更前:
-
生成されるファイル名のロジック変更:
- 変更前:
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.
プレフィックスを付加していました。例えば、version
が1.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.
の重複を避けることです。例えば、version
がgo1.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
ファイルに対する変更を示しています。
-
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がビルドされるようになります。 -
バイナリ配布物ファイル名の生成ロジック変更:
- 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.
プレフィックスをversion
、OS
、Arch
の前に付加していました。 - 変更後は、まず
version.OS-Arch
の形式でベース名を生成します。 - その後に
if !strings.HasPrefix(base, "go")
という条件文が追加されています。これは、生成されたbase
文字列が既にgo
で始まっていない場合にのみ、go.
プレフィックスを追加するという意味です。 - このロジックにより、例えば
version
がgo1.0
のような形式の場合、以前はgo.go1.0.linux-amd64
となっていたファイル名が、go1.0.linux-amd64
のように冗長なgo.
が削除され、より簡潔になります。
- 変更前は、常に
-
ソースコード配布物ファイル名の生成ロジック変更:
- 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.
プレフィックスを追加します。 - これにより、ソースコード配布物のファイル名も、
version
がgo1.0
のような形式の場合に冗長なgo.
が削除され、簡潔になります。
これらの変更は、Goのビルドシステムが生成する成果物の命名規則をよりスマートにし、デフォルトのビルドターゲットを安定版にシフトさせることで、開発者とユーザー双方にとっての利便性を向上させています。
関連リンク
- Go CL 6117066: https://golang.org/cl/6117066
参考にした情報源リンク
- Go build filename conventions: https://mohitkhare.com/blog/go-filename-conventions/
- Go build filename conventions (Stack Overflow): https://stackoverflow.com/questions/24809223/go-filename-conventions
- Go build filename conventions (Medium): https://medium.com/@ashish.goyal/go-naming-conventions-and-best-practices-a-comprehensive-guide-for-clean-and-maintainable-code-b1c7e7e7e7e7
- Go misc/dist/bindist.go purpose: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFneVicdlTV2YpsX1tHjL2Wp26m0HbttJqKA887osolkw9OLTgoo04zzAh7_figTzCqbZIZi8D3k98bSR7akwE7VusokffeYB6eXXNxfrD67R3NcaSYYRbo92maa0NMVE-d
- Go Mercurial tag to check out: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQExAptLbvfZwBWKf4diFZ0GLEydUIXZyFs0tS-8cjHzlqT82aKNKcHDq7Y-EzRIyHM66n2sxcFVuLeW0fOAmWtl41xNG0EYtsFxzl_xzSUE-_FSNdozjR73b9P2QqV31nZwz5gSj-46F5q0001KlI8=