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

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

このコミットは、Go言語の標準ライブラリにおいて、asn1, csv, gob, json, xml といったデータエンコーディング/デコーディングに関連するパッケージを、encoding ディレクトリ配下に移動させるものです。これにより、Go 1リリースに向けたパッケージ構造の整理と一貫性の向上が図られています。変更されたファイルは主にパッケージの移動に伴う Makefiledeps.bash の更新であり、各パッケージ内のGoソースコード自体には変更がありません。

コミット

  • コミットハッシュ: f4cd80224a0b1b3ba7448f87fe048bcea9caae7f
  • Author: Rob Pike r@golang.org
  • Date: Thu Nov 3 11:39:52 2011 -0700

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

https://github.com/golang/go/commit/f4cd80224a0b1b3ba7448f87fe048bcea9caae7f

元コミット内容

encoding: move asn1, csv, gob, json, xml into encoding
This is Go 1 package renaming CL #1.
This one merely moves the source; the import strings will be
changed after the next weekly release.

The only edits are in Makefiles.

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

変更の背景

このコミットは、Go言語のメジャーリリースであるGo 1に向けた大規模なパッケージ構造の再編の一環として行われました。Go 1では、標準ライブラリのAPIの安定化と整理が重要な目標の一つであり、その中で関連性の高いパッケージを論理的にグループ化することが求められました。

具体的には、asn1 (Abstract Syntax Notation One), csv (Comma Separated Values), gob (Go Binary), json (JavaScript Object Notation), xml (Extensible Markup Language) といったパッケージは、いずれもデータのエンコーディング(符号化)およびデコーディング(復号化)という共通の機能を提供します。これらを独立したトップレベルのパッケージとして配置するのではなく、encoding という共通の親ディレクトリの下にまとめることで、ライブラリ全体の構造をより直感的で一貫性のあるものにすることが目的でした。

コミットメッセージにある「This is Go 1 package renaming CL #1.」という記述は、これがGo 1リリースに向けたパッケージ名変更(または移動)の最初の変更リスト(Change List)であることを示しており、今後も同様の整理が行われることを示唆しています。また、「This one merely moves the source; the import strings will be changed after the next weekly release.」とあるように、このコミットではソースコードの物理的な移動のみが行われ、Goコード内の import パスは次の週次リリース後に変更される予定でした。これは、段階的な移行を計画し、ユーザーへの影響を最小限に抑えるための配慮と考えられます。

前提知識の解説

Go言語のパッケージシステム

Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからインポートして利用することができます。Goの標準ライブラリは、多数のパッケージで構成されており、それぞれが特定の機能(例: ネットワーク、ファイルI/O、暗号化など)を提供します。パッケージのパスは通常、ファイルシステムのディレクトリ構造に対応しています。例えば、src/pkg/json にあるパッケージは json としてインポートされます。

encoding パッケージ群

Go言語の標準ライブラリには、様々なデータ形式を扱うための encoding パッケージ群が存在します。これらは、Goのデータ構造と外部のデータ形式(JSON、XML、バイナリなど)との間で変換を行う機能を提供します。例えば、encoding/json はGoの構造体をJSON文字列に変換したり、JSON文字列をGoの構造体にパースしたりする機能を提供します。

Makefile

Makefile は、Goプロジェクトのビルドプロセスを自動化するために使用されるファイルです。Goのソースコードをコンパイルし、実行可能ファイルを生成したり、テストを実行したりする際の手順が記述されています。このコミットでは、パッケージの移動に伴い、ビルドシステムが新しいパスを認識できるように MakefileDIRS 変数(ビルド対象のディレクトリリスト)が更新されています。

deps.bash

deps.bash は、Goのビルドシステムの一部として、パッケージ間の依存関係を解決するために使用されるシェルスクリプトです。Goのパッケージは他のパッケージに依存することがあり、ビルド時にはこれらの依存関係が正しく解決される必要があります。このスクリプトは、パッケージのインポートパスに基づいて依存関係を抽出し、ビルド順序を決定する役割を担っています。パッケージの移動に伴い、古いパスから新しいパスへのマッピングを一時的に追加することで、依存関係の解決が引き続き機能するように変更されています。

技術的詳細

このコミットの技術的な詳細は、主にファイルパスの変更と、それに伴うビルドシステム関連ファイルの更新に集約されます。

  1. パッケージの移動: src/pkg/asn1src/pkg/encoding/asn1 へ、 src/pkg/csvsrc/pkg/encoding/csv へ、 src/pkg/gobsrc/pkg/encoding/gob へ、 src/pkg/jsonsrc/pkg/encoding/json へ、 src/pkg/xmlsrc/pkg/encoding/xml へ、 それぞれ移動されました。 similarity index 100% の表示は、ファイルの内容が完全に同一であることを意味し、rename from ... rename to ... はファイルが移動されたことを示します。これは、Goソースコード自体には変更がなく、単にディレクトリ構造が変更されたことを裏付けています。

  2. src/pkg/Makefile の変更: MakefileDIRS 変数から、移動されたパッケージの古いパス(例: asn1, csv, gob, json, xml)が削除され、代わりに新しい encoding ディレクトリ配下のパス(例: encoding/asn1, encoding/csv, encoding/gob, encoding/json, encoding/xml)が追加されています。これにより、ビルドシステムが新しいパッケージの場所を正しく認識し、ビルド対象に含めることができます。

  3. src/pkg/deps.bash の変更: deps.bash スクリプトには、パッケージの移動に伴う一時的な対応が追加されています。

    • dirpat 変数に、移動前のパッケージ名(asn1, csv, gob, json, xml)が正規表現として追加されています。これは、古いインポートパスがまだコード内に残っている場合に備えて、それらを認識できるようにするためです。
    • 依存関係の解決ロジックに awk コマンドが追加され、古いパッケージ名(例: asn1.install)が検出された場合に、対応する新しいパッケージ名(例: encoding/asn1.install)に変換するマッピングが定義されています。これは、Goコード内の import パスがまだ更新されていない期間において、ビルドが正しく機能するようにするための暫定的な措置です。コミットメッセージにある「TODO: clean up after renaming.」というコメントは、この一時的なマッピングが将来的に削除されるべきであることを示しています。
  4. 各パッケージの Makefile の変更: 移動された各パッケージ(asn1, csv, gob, json, xml)内の Makefile も更新されています。具体的には、include ../../Make.inc および include ../../Make.pkg のパスが、新しいディレクトリ構造に合わせて include ../../../Make.inc および include ../../../Make.pkg に変更されています。これは、親ディレクトリへの相対パスが変更されたため、ビルドインクルードファイルへの参照を修正する必要があったためです。

これらの変更は、Go 1リリースに向けた大規模なリファクタリングの一環として、ビルドシステムとパッケージ構造の整合性を保つために慎重に行われたことを示しています。

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

このコミットにおける「コアとなるコードの変更箇所」は、Go言語のソースコードそのものではなく、Goのビルドシステムを構成する Makefiledeps.bash、そして各パッケージの Makefile になります。

  • src/pkg/Makefile:

    • DIRS 変数から asn1, csv, gob, json, xml を削除。
    • DIRS 変数に encoding/asn1, encoding/csv, encoding/gob, encoding/json, encoding/xml を追加。
  • src/pkg/deps.bash:

    • dirpat 変数に古いパッケージ名(asn1, csv, gob, json, xml)の正規表現を追加。
    • 依存関係解決ロジックに、古いパッケージ名から新しいパッケージ名へのマッピングを行う awk コマンドを追加。
  • src/pkg/{ => encoding}/asn1/Makefile (同様に csv, gob, json, xmlMakefile も):

    • include ../../Make.incinclude ../../../Make.inc に変更。
    • include ../../Make.pkginclude ../../../Make.pkg に変更。

Go言語のソースファイル自体(例: asn1.go, reader.go, decode.go など)は、ファイルパスが変更されただけで、内容には一切変更がありません。

コアとなるコードの解説

このコミットの核心は、Go 1リリースにおける標準ライブラリのパッケージ構造の整理と、それに伴うビルドシステムの適応です。

Go言語の設計思想の一つに「シンプルさ」と「一貫性」があります。encoding パッケージ群は、様々なデータ形式を扱うための共通の目的を持つため、これらを encoding という単一の親ディレクトリの下にまとめることは、ライブラリの論理的な構造を強化し、開発者が関連する機能を見つけやすくするために重要です。

この変更は、Go言語の標準ライブラリが成熟し、より大規模なプロジェクトや多様な用途に対応するために、初期の段階で確立されたパッケージ構造を見直し、よりスケーラブルでメンテナンスしやすい形に進化させる過程の一部です。

Goソースコード自体に変更がないのは、このコミットが純粋に「移動」と「ビルドシステムの更新」に焦点を当てているためです。これにより、機能的な変更を伴わないクリーンな構造変更が可能となり、後続の import パスの変更作業を独立して進めることができます。deps.bash における一時的なマッピングは、この移行期間中の互換性を確保するための賢明なアプローチであり、ユーザーがGo 1への移行をスムーズに行えるようにするための配慮が伺えます。

関連リンク

参考にした情報源リンク

  • Go 1 Release Notes (Go 1における encoding パッケージの変更に関する情報): https://go.dev/doc/go1 (特に "encoding/xml" や "encoding/binary" の変更に関する記述が関連します。)