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

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

このコミットは、Go言語の標準ライブラリから一部のパッケージを削除し、それらを独立した「サブリポジトリ」へ移行する大規模な変更を反映しています。具体的には、cryptoencodingexpwebsocket などの実験的または特定の用途に特化したパッケージ群、および 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言語は初期段階から急速に進化しており、その標準ライブラリも多くの機能を取り込んでいました。しかし、プロジェクトが成熟するにつれて、以下の課題が浮上しました。

  1. メインリポジトリの肥大化: 実験的なパッケージや、すべてのGoユーザーにとって必須ではない特定の用途のパッケージがメインリポジトリに含まれることで、リポジトリが肥大化し、管理が複雑になっていました。
  2. リリースサイクルの制約: メインリポジトリ内のすべてのパッケージは、Goの主要なリリースサイクル(通常は半年ごと)に縛られていました。これにより、特定のパッケージのバグ修正や新機能の追加が、Go全体のリリースを待つ必要があり、迅速な開発が妨げられることがありました。
  3. 依存関係の明確化: 当時の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サブリポジトリ (golang.org/x/):
    • Goチームが公式にメンテナンスしているが、Goのメインリポジトリ(github.com/golang/go)とは独立したGitリポジトリで管理されるパッケージ群です。
    • これらのリポジトリは通常 golang.org/x/ のパスでホストされており、例えば golang.org/x/cryptogolang.org/x/net などがあります。
    • サブリポジトリの導入により、Goのコア開発とは独立して、これらのパッケージの更新や実験的な機能の追加が可能になりました。ユーザーは go get golang.org/x/crypto/bcrypt のように明示的にこれらのパッケージを取得して利用します。

技術的詳細

このコミットの技術的な詳細は、主に以下の点に集約されます。

  1. 大量のファイル削除: src/cmd/hgpatch ディレクトリ全体と、src/pkg 以下の多数のパッケージディレクトリが削除されています。これには、crypto 以下の様々な暗号アルゴリズム(bcrypt, blowfish, cast5, md4, ocsp, openpgp, ripemd160, twofish, xtea)、encoding/git85exp 以下の実験的なネットワークプロトコル(spdy, ssh)、および websocket パッケージが含まれます。
  2. Makefileの変更:
    • src/cmd/Makefile から hgpatch の参照が削除されています。これは、hgpatch コマンドがGoのビルドシステムから除外されたことを意味します。
    • src/pkg/Makefile から、削除されたすべてのパッケージディレクトリへの参照が削除されています。これにより、これらのパッケージはGoの標準ライブラリの一部としてビルドされなくなります。
  3. ユーザーへの影響:
    • この変更以前にこれらのパッケージをインポートしていたGoユーザーは、コードを更新する必要があります。具体的には、import "crypto/bcrypt" のような記述を import "golang.org/x/crypto/bcrypt" のように変更し、go get golang.org/x/crypto/bcrypt を実行して新しい場所からパッケージを取得する必要があります。
    • これにより、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/cryptogolang.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と直接対応しない場合があることを示唆しています。