[インデックス 11387] ファイルの概要
このコミットは、Go言語の標準ライブラリから一部のパッケージを削除し、それらを独立した「サブリポジトリ」へ移行する大規模な変更を反映しています。具体的には、crypto
、encoding
、exp
、websocket
などの実験的または特定の用途に特化したパッケージ群、および hgpatch
コマンドがGoのメインリポジトリから削除されました。これにより、Goのコアディストリビューションがよりスリムになり、これらのパッケージは個別の開発サイクルを持つことができるようになりました。
コミット
commit 0368ca138babbceb0d4938b421465cb0c3f378f0
Author: Russ Cox <rsc@golang.org>
Date: Wed Jan 25 15:30:42 2012 -0500
build: remove code now in subrepositories
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5569064
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0368ca138babbceb0d4938b421465cb0c3f378f0
元コミット内容
このコミットの元の内容は、「ビルド: 現在サブリポジトリにあるコードを削除」というものです。これは、Goのメインリポジトリから、すでに独立したサブリポジトリに移行されたコードベースを物理的に削除する作業を指します。
変更の背景
Go言語は初期段階から急速に進化しており、その標準ライブラリも多くの機能を取り込んでいました。しかし、プロジェクトが成熟するにつれて、以下の課題が浮上しました。
- メインリポジトリの肥大化: 実験的なパッケージや、すべてのGoユーザーにとって必須ではない特定の用途のパッケージがメインリポジトリに含まれることで、リポジトリが肥大化し、管理が複雑になっていました。
- リリースサイクルの制約: メインリポジトリ内のすべてのパッケージは、Goの主要なリリースサイクル(通常は半年ごと)に縛られていました。これにより、特定のパッケージのバグ修正や新機能の追加が、Go全体のリリースを待つ必要があり、迅速な開発が妨げられることがありました。
- 依存関係の明確化: 当時のGoには、現在のGo Modulesのような洗練された依存関係管理システムが存在しませんでした。そのため、標準ライブラリに含まれるパッケージと、外部のパッケージとの区別が曖昧になりがちでした。
これらの課題を解決するため、Goチームは「サブリポジトリ」という概念を導入しました。これは、Goチームが公式にメンテナンスするものの、Goのメインリポジトリとは独立したGitリポジトリで管理されるパッケージ群です。このコミットは、そのサブリポジトリへの移行作業の一環として、メインリポジトリから該当するコードを削除するものです。これにより、Goのコアディストリビューションはより軽量で安定したものとなり、サブリポジトリのパッケージはより柔軟な開発とリリースが可能になりました。
前提知識の解説
このコミットを理解するためには、当時のGoのパッケージ管理とリポジトリ構造に関する以下の知識が必要です。
- Goのパッケージ管理(2012年時点):
- 2012年当時、Go Modules(Go 1.11で導入)はまだ存在しませんでした。
- Goの依存関係管理は主に
go get
コマンドに依存しており、これは指定されたURLからソースコードをダウンロードし、GOPATH
に配置するシンプルなものでした。 - プロジェクトは
GOPATH
内に配置され、インポートパスはGOPATH
を基準として解決されました。 - 標準ライブラリのパッケージはGoのインストールディレクトリ(
GOROOT
)内にあり、特別な設定なしにインポートできました。
- Goの標準ライブラリ:
- Go言語のインストール時に同梱される、公式に提供されるパッケージ群です。
fmt
,net/http
,io
など、Goアプリケーション開発の基盤となる機能を提供します。 - このコミット以前は、現在サブリポジトリにある多くのパッケージもこの標準ライブラリの一部として扱われていました。
- Go言語のインストール時に同梱される、公式に提供されるパッケージ群です。
- Goサブリポジトリ (
golang.org/x/
):- Goチームが公式にメンテナンスしているが、Goのメインリポジトリ(
github.com/golang/go
)とは独立したGitリポジトリで管理されるパッケージ群です。 - これらのリポジトリは通常
golang.org/x/
のパスでホストされており、例えばgolang.org/x/crypto
やgolang.org/x/net
などがあります。 - サブリポジトリの導入により、Goのコア開発とは独立して、これらのパッケージの更新や実験的な機能の追加が可能になりました。ユーザーは
go get golang.org/x/crypto/bcrypt
のように明示的にこれらのパッケージを取得して利用します。
- Goチームが公式にメンテナンスしているが、Goのメインリポジトリ(
技術的詳細
このコミットの技術的な詳細は、主に以下の点に集約されます。
- 大量のファイル削除:
src/cmd/hgpatch
ディレクトリ全体と、src/pkg
以下の多数のパッケージディレクトリが削除されています。これには、crypto
以下の様々な暗号アルゴリズム(bcrypt
,blowfish
,cast5
,md4
,ocsp
,openpgp
,ripemd160
,twofish
,xtea
)、encoding/git85
、exp
以下の実験的なネットワークプロトコル(spdy
,ssh
)、およびwebsocket
パッケージが含まれます。 - Makefileの変更:
src/cmd/Makefile
からhgpatch
の参照が削除されています。これは、hgpatch
コマンドがGoのビルドシステムから除外されたことを意味します。src/pkg/Makefile
から、削除されたすべてのパッケージディレクトリへの参照が削除されています。これにより、これらのパッケージはGoの標準ライブラリの一部としてビルドされなくなります。
- ユーザーへの影響:
- この変更以前にこれらのパッケージをインポートしていたGoユーザーは、コードを更新する必要があります。具体的には、
import "crypto/bcrypt"
のような記述をimport "golang.org/x/crypto/bcrypt"
のように変更し、go get golang.org/x/crypto/bcrypt
を実行して新しい場所からパッケージを取得する必要があります。 - これにより、Goのコアディストリビューションのサイズが削減され、ダウンロードやビルドの時間が短縮されます。
- サブリポジトリのパッケージは、Goの主要なリリースサイクルとは独立して更新されるため、ユーザーはより頻繁に最新の機能やバグ修正を利用できるようになります。
- この変更以前にこれらのパッケージをインポートしていたGoユーザーは、コードを更新する必要があります。具体的には、
このコミットは、Goプロジェクトの構造とメンテナンス戦略における重要な転換点を示しており、Goエコシステムの成熟に貢献しました。
コアとなるコードの変更箇所
このコミットのコアとなる変更は、主に以下のファイルとディレクトリの削除、および Makefile
の修正です。
src/cmd/Makefile
:CLEANDIRS
およびDIRS
からhgpatch
のエントリが削除されました。
src/cmd/hgpatch/
ディレクトリ全体:Makefile
,doc.go
,main.go
など、hgpatch
コマンドに関連するすべてのソースファイルが削除されました。
src/pkg/Makefile
:DIRS
リストから、以下のパッケージへの参照が削除されました。crypto/blowfish
crypto/bcrypt
crypto/cast5
crypto/md4
crypto/ocsp
crypto/openpgp
(およびそのサブパッケージarmor
,elgamal
,errors
,packet
,s2k
)crypto/ripemd160
crypto/twofish
crypto/xtea
encoding/git85
exp/spdy
exp/ssh
websocket
net/dict
patch
NOTEST
リストからも同様に、これらのパッケージへの参照が削除されました。
src/pkg/
以下の削除されたパッケージディレクトリ群:src/pkg/crypto/bcrypt/
src/pkg/crypto/blowfish/
src/pkg/crypto/cast5/
src/pkg/crypto/md4/
src/pkg/crypto/ocsp/
src/pkg/crypto/openpgp/
(およびそのサブディレクトリ)src/pkg/crypto/ripemd160/
src/pkg/crypto/twofish/
src/pkg/crypto/xtea/
src/pkg/encoding/git85/
src/pkg/exp/spdy/
src/pkg/exp/ssh/
src/pkg/websocket/
src/pkg/net/dict/
src/pkg/patch/
これらの変更は、Goのビルドシステムとリポジトリ構造から、これらのパッケージが完全に切り離されたことを明確に示しています。
コアとなるコードの解説
このコミット自体は、既存のコードを削除し、ビルド設定を変更するものであり、新しい機能を追加したり、既存のロジックを変更したりするものではありません。したがって、特定の「コアとなるコードの解説」は、削除された各パッケージの機能ではなく、それらがGoのメインリポジトリからどのように取り除かれたかという点に焦点を当てます。
削除された各パッケージは、それぞれが独立した機能を提供していました。例えば、crypto/bcrypt
はパスワードハッシュのためのbcryptアルゴリズムを、exp/ssh
はSSHプロトコルの実装を、websocket
はWebSocketプロトコルの実装を提供していました。これらのパッケージは、Goのメインリポジトリから削除された後、それぞれ golang.org/x/crypto
、golang.org/x/net
などのサブリポジトリに移動され、そこで引き続き開発・メンテナンスが行われています。
このコミットの「コア」は、Goのビルドプロセスからこれらのパッケージを切り離す Makefile
の変更にあります。Makefile
はGoプロジェクトのビルド方法を定義するものであり、ここからパッケージのエントリを削除することで、Goのコンパイラやツールチェーンがこれらのパッケージを標準ライブラリの一部として認識しなくなり、ビルド対象から外れることになります。
例えば、src/pkg/Makefile
の変更は、DIRS
変数から削除されたパッケージのディレクトリ名を削除しています。DIRS
は、Goのビルドシステムがパッケージをビルドする際に探索するディレクトリのリストです。このリストから削除することで、これらのパッケージはGoの標準ライブラリの一部としてビルドされなくなります。
関連リンク
- Go言語の公式ブログ(サブリポジトリに関する発表や議論が行われた可能性があります。当時のブログ記事を検索すると、より詳細な背景情報が得られるかもしれません。)
golang.org/x/
の各サブリポジトリのGitHubページ(例:https://github.com/golang/crypto
,https://github.com/golang/net
)
参考にした情報源リンク
- Go言語の公式ドキュメント(特に、Go Modules導入以前のパッケージ管理に関する情報)
- Go言語の歴史に関する記事やブログポスト
- GitHubのGo言語リポジトリのコミット履歴
- Gerrit Code Review (golang.org/cl) - コミットメッセージに記載されているCL番号は、Goプロジェクトが使用しているGerritシステムにおける変更リストのIDです。ただし、今回の検索結果では、同じCL番号が別のコミットに紐付けられていたため、直接的な参照はできませんでした。これは、CL番号が内部的なものであり、時間の経過とともに再利用されたり、公開URLと直接対応しない場合があることを示唆しています。