[インデックス 11489] ファイルの概要
このコミットは、Go言語の標準ライブラリに含まれるパッケージのリネームを処理するためのツールである src/cmd/fix/go1pkgrename.go ファイルに対する変更です。具体的には、image/bmp と image/tiff パッケージが、Go 1リリースに伴うパッケージ構造の変更により、code.google.com/p/go.image/bmp および code.google.com/p/go.image/tiff へと移動されたことを反映するためのエントリが追加されています。
コミット
このコミットは、go1pkgrename ツールに image/bmp と image/tiff パッケージのリネームルールを追加することで、Go 1リリースにおけるパッケージパスの変更に対応することを目的としています。これにより、古いパッケージパスを使用している既存のGoプログラムが、新しいパッケージパスに自動的に修正されるようになります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/61ac24cecc8f3d69a808cfb19236c07411b63856
元コミット内容
commit 61ac24cecc8f3d69a808cfb19236c07411b63856
Author: Nigel Tao <nigeltao@golang.org>
Date: Tue Jan 31 12:27:58 2012 +1100
fix: add image/{bmp,tiff} to go1pkgrename.
R=rsc, r
CC=golang-dev
https://golang.org/cl/5581053
---
src/cmd/fix/go1pkgrename.go | 4 ++++\
1 file changed, 4 insertions(+)\
diff --git a/src/cmd/fix/go1pkgrename.go b/src/cmd/fix/go1pkgrename.go
index 7dc952dfad..c1a11c83c8 100644
--- a/src/cmd/fix/go1pkgrename.go
+++ b/src/cmd/fix/go1pkgrename.go
@@ -68,6 +68,10 @@ var go1PackageRenames = []struct{ old, new string }{\
{"crypto/xtea", "code.google.com/p/go.crypto/xtea"},\
{"exp/ssh", "code.google.com/p/go.crypto/ssh"},\
\
+\t// go.image sub-repository\
+\t{\"image/bmp\", \"code.google.com/p/go.image/bmp\"},\
+\t{\"image/tiff\", \"code.google.com/p/go.image/tiff\"},\
+\
\t// go.net sub-repository\
\t{\"net/dict\", "code.google.com/p/go.net/dict\"},\
\t{\"net/websocket\", "code.google.com/p/go.net/websocket\"},\
変更の背景
この変更は、Go言語がバージョン1.0(Go 1)をリリースする準備の一環として行われました。Go 1は、Go言語の安定したAPIと互換性を保証する最初のメジャーリリースでした。このリリースに向けて、Goチームは標準ライブラリの整理と再編成を行いました。
その過程で、一部のパッケージは標準ライブラリのコア部分から分離され、code.google.com/p/go.crypto や code.google.com/p/go.net のような「サブリポジトリ」と呼ばれる独立したリポジトリに移動されました。image/bmp と image/tiff パッケージも同様に、code.google.com/p/go.image サブリポジトリへと移動されました。
このような移動の主な目的は以下の通りです。
- 標準ライブラリの軽量化: 全ての機能を標準ライブラリに含めるのではなく、利用頻度や依存関係に応じて分離することで、Goの配布サイズを小さくし、コアライブラリの保守を容易にする。
- 独立した開発: サブリポジトリとして分離されたパッケージは、Go本体のリリースサイクルとは独立して開発・更新が可能になる。
- 明確な責務: 各パッケージの責務をより明確にし、コードベースのモジュール性を高める。
この変更は、Go 1への移行をスムーズにするために、既存のコードベースが新しいパッケージパスに自動的に適応できるようにするための go1pkgrename ツールの一部として実装されました。
前提知識の解説
Go 1の互換性保証
Go 1は、Go言語の歴史において非常に重要なマイルストーンでした。このリリース以降、Goチームは「Go 1の互換性保証」を掲げ、Go 1で書かれたプログラムは将来のGoのバージョンでも動作し続けることを約束しました。この互換性保証を維持するためには、APIの安定性が不可欠であり、パッケージパスの変更のような破壊的変更は、特別な移行ツールによってサポートされる必要がありました。
go fix コマンドと go1pkgrename
Go言語には、コードの自動修正を行うための go fix コマンドが存在します。これは、Go言語のバージョンアップに伴うAPIの変更や、推奨されるコーディングスタイルへの準拠など、様々な修正を自動的に適用するために使用されます。
go1pkgrename は、この go fix コマンドの一部として機能する内部的なツール(またはその設定ファイル)です。Go 1リリース時に、標準ライブラリ内の多くのパッケージが新しいパスに移動されたため、既存のGoプログラムがこれらの変更に適応できるように、go1pkgrename が導入されました。このツールは、古いパッケージのインポートパスを検出し、対応する新しいパスに自動的に書き換える役割を担っていました。
Goのパッケージ管理(Go Modules以前)
このコミットが作成された2012年当時、Go言語には現在のようなGo Modules(Go 1.11で導入)は存在しませんでした。当時のGoのパッケージ管理は、主にGOPATHという環境変数に依存していました。GOPATHは、Goのソースコード、コンパイル済みバイナリ、パッケージのキャッシュが配置されるワークスペースのルートディレクトリを指定していました。
外部パッケージは、go get コマンドを使用して、GOPATH内の適切なディレクトリに直接ダウンロードされていました。このため、パッケージのインポートパスは、そのパッケージがホストされているリポジトリのURL(例: code.google.com/p/go.image/bmp)と密接に結びついていました。
サブリポジトリ (Sub-repositories)
Go 1リリース前後で、Goチームは一部のパッケージをメインのGoリポジトリから分離し、独立したGit(またはMercurial)リポジトリとして管理するようになりました。これらは「サブリポジトリ」と呼ばれ、code.google.com/p/go.crypto、code.google.com/p/go.net、code.google.com/p/go.image などがありました。
これらのサブリポジトリは、Goの標準ライブラリの一部として扱われつつも、Go本体とは異なる開発サイクルを持つことができました。ユーザーはこれらのパッケージを go get で取得し、通常のパッケージと同様にインポートして使用しました。
技術的詳細
src/cmd/fix/go1pkgrename.go ファイルは、go fix コマンドがパッケージ名をリネームする際に参照するマッピングを定義しています。このファイルには、go1PackageRenames という名前の構造体のスライスが定義されており、各要素は old と new という2つの文字列フィールドを持つ匿名構造体です。
var go1PackageRenames = []struct{ old, new string }{
// ... 既存のリネームルール ...
{"image/bmp", "code.google.com/p/go.image/bmp"},
{"image/tiff", "code.google.com/p/go.image/tiff"},
// ... その他のリネームルール ...
}
このコミットでは、この go1PackageRenames スライスに以下の2つのエントリが追加されています。
{"image/bmp", "code.google.com/p/go.image/bmp"}: これは、古いimage/bmpパッケージへのインポートを、新しいcode.google.com/p/go.image/bmpパッケージへのインポートに置き換えることをgo fixに指示します。{"image/tiff", "code.google.com/p/go.image/tiff"}: 同様に、古いimage/tiffパッケージへのインポートを、新しいcode.google.com/p/go.image/tiffパッケージへのインポートに置き換えます。
go fix コマンドがGoのソースコードを解析する際、これらのマッピングルールに基づいて import ステートメントを走査し、古いパスが見つかれば新しいパスに自動的に書き換えます。これにより、開発者は手動で何百ものファイル内のインポートパスを修正する手間を省くことができました。
コメント // go.image sub-repository は、これらのパッケージが go.image というサブリポジトリに属していることを示しており、当時のGoのパッケージ構造を理解する上で重要な情報です。
コアとなるコードの変更箇所
--- a/src/cmd/fix/go1pkgrename.go
+++ b/src/cmd/fix/go1pkgrename.go
@@ -68,6 +68,10 @@ var go1PackageRenames = []struct{ old, new string }{\
{"crypto/xtea", "code.google.com/p/go.crypto/xtea"},\
{"exp/ssh", "code.google.com/p/go.crypto/ssh"},\
\
+\t// go.image sub-repository\
+\t{\"image/bmp\", \"code.google.com/p/go.image/bmp\"},\
+\t{\"image/tiff\", \"code.google.com/p/go.image/tiff\"},\
+\
\t// go.net sub-repository\
\t{\"net/dict\", "code.google.com/p/go.net/dict\"},\
\t{\"net/websocket\", "code.google.com/p/go.net/websocket\"},\
コアとなるコードの解説
変更の中心は、go1PackageRenames というグローバル変数(スライス)への追加です。このスライスは、go fix ツールがGo 1への移行時にパッケージ名を自動的にリネームするために使用する、古いパスと新しいパスのペアを格納しています。
追加された4行は以下の通りです。
// go.image sub-repository: これはコメントであり、続くエントリがgo.imageサブリポジリに関連するものであることを示しています。当時のGoのパッケージエコシステムにおける構造を理解する上で役立つメタ情報です。{"image/bmp", "code.google.com/p/go.image/bmp"},: この行は、image/bmpというパッケージがcode.google.com/p/go.image/bmpという新しいパスに移動したことを定義しています。go fixは、ソースコード内でimport "image/bmp"のような記述を見つけると、それをimport "code.google.com/p/go.image/bmp"に自動的に書き換えます。{"image/tiff", "code.google.com/p/go.image/tiff"},: 同様に、この行はimage/tiffパッケージがcode.google.com/p/go.image/tiffに移動したことを定義し、go fixによる自動修正の対象とします。
これらの追加により、Go 1リリース時に image/bmp および image/tiff パッケージを使用していた既存のGoプログラムが、go fix コマンドを実行するだけで、新しいパッケージパスにスムーズに移行できるようになりました。これは、Go 1の互換性保証を維持し、開発者の移行コストを最小限に抑えるための重要なメカニズムでした。
関連リンク
- Go 1 Release Notes: https://go.dev/doc/go1 (Go 1のリリースノートには、パッケージの変更に関する情報が含まれている可能性があります)
go fixcommand documentation: https://go.dev/cmd/go/#hdr-Fix_packages_to_use_new_APIs (現在のgo fixコマンドのドキュメント)- Goのサブリポジトリに関する議論(当時のメーリングリストなど): 特定のリンクは難しいですが、
golang-devメーリングリストのアーカイブには関連する議論があるかもしれません。
参考にした情報源リンク
commit_data/11489.txtのコミット情報- Google Web Search (query: "go1pkgrename go.image sub-repository")
- Go言語の歴史とGo 1リリースに関する一般的な知識
- Go言語のパッケージ管理(Go Modules以前)に関する一般的な知識
go fixコマンドの機能に関する一般的な知識- Go言語の公式ドキュメント (Go 1リリースノートなど)