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

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

このコミットは、Go言語の標準ライブラリにおけるパッケージの再編成と名称変更に関するものです。特に、execscannertabwritertemplateutf16utf8といったパッケージが、それぞれ os/exectext/scannertext/tabwritertext/templateunicode/utf16unicode/utf8 のように、より論理的な階層構造を持つディレクトリに移動されました。これはGo 1リリースに向けた大規模なパッケージ再編の一環であり、ソースコードの物理的な移動が主な変更点です。

コミット

  • コミットハッシュ: 37d82c85201351d8df424b8043d91c1dc32a0531
  • Author: Rob Pike r@golang.org
  • Date: Thu Nov 3 14:18:06 2011 -0700
    os,text,unicode: renamings
    This is Go 1 package renaming CL #4.
    This one merely moves the source; the import strings will be
    changed after the next weekly release.
    This one moves pieces into os, text, and unicode.
    
    exec -> os/exec
    scanner -> text/scanner
    tabwriter -> text/tabwriter
    template -> text/template
    template/parse -> text/template/parse
    utf16 -> unicode/utf16
    utf8 -> unicode/utf8
    
    This should be the last of the source-rearranging CLs.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5331066

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

https://github.com/golang/go/commit/37d82c85201351d8df424b8043d91c1dc32a0531

元コミット内容

このコミットは、Go 1リリースに向けたパッケージ名称変更の第4弾です。ソースコードの物理的な移動のみを行い、インポートパスの変更は次回の週次リリース後に行われる予定です。具体的には、exec パッケージを os ディレクトリ配下に、scannertabwritertemplate パッケージを text ディレクトリ配下に、utf16utf8 パッケージを unicode ディレクトリ配下に移動しています。これはソースコードの再配置に関する最後のコミットとなる見込みです。

変更の背景

このコミットは、Go言語がバージョン1.0のリリースを控えていた時期に行われた、大規模な標準ライブラリの再編成の一環です。Go 1の目標は、言語と標準ライブラリの安定した基盤を確立し、将来のリリースにおける後方互換性を保証することでした。

当時のGo言語のパッケージ構造は、まだ発展途上にあり、一部のパッケージは機能的に関連性の高い他のパッケージと論理的にグループ化されていませんでした。例えば、プロセス実行に関連する exec パッケージは、オペレーティングシステム関連の機能を提供する os パッケージの配下にあるべき、という考え方がありました。同様に、テキスト処理に関連する scannertemplatetext パッケージの配下に、Unicode関連の utf16utf8unicode パッケージの配下にあるべき、という設計思想が適用されました。

この再編成の主な目的は以下の通りです。

  1. 論理的なグループ化: 関連する機能をまとめることで、開発者が目的のパッケージを見つけやすくし、標準ライブラリ全体の構造をより直感的に理解できるようにする。
  2. APIの安定化: Go 1リリース後も長期にわたって安定したAPIを提供するため、初期段階で徹底的な整理を行う。これにより、将来的な破壊的変更を最小限に抑える。
  3. go fix ツールの活用: パッケージの名称変更や移動に伴う既存コードの修正を支援するため、go fix ツールが導入されました。このツールは、ほとんどのインポートパスの変更を自動的に処理できるように設計されており、開発者の移行コストを軽減しました。

このコミットは、ソースコードの物理的な移動に焦点を当てており、インポートパスの変更は後続のコミットで処理されることが明記されています。これは、大規模な変更を段階的に適用し、各ステップでの影響を管理するための一般的な開発プラクティスです。

前提知識の解説

Go言語のパッケージと標準ライブラリ

Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからインポートして利用できます。Goの標準ライブラリは、Go言語のインストール時に提供される一連の組み込みパッケージであり、ファイルI/O、ネットワーク、暗号化、データ構造など、幅広い機能を提供します。

Makefile

Makefile は、Goプロジェクトのビルドプロセスを自動化するために使用されるファイルです。Go 1リリース前のGoプロジェクトでは、Makefile がパッケージのコンパイル順序や依存関係を定義するために広く使われていました。このコミットでは、パッケージの移動に伴い、Makefile 内のパス定義が更新されています。

deps.bash

deps.bash は、Goのビルドシステムの一部として、パッケージ間の依存関係を解決するために使用されるシェルスクリプトです。パッケージの名称変更や移動があった場合、このスクリプトも更新され、新しいパスを正しく認識できるようにする必要があります。

exec パッケージ (Go 1以前)

Go 1以前の exec パッケージは、外部コマンドを実行するための機能を提供していました。例えば、シェルコマンドを実行したり、別のプログラムを起動したりする際に使用されました。Go 1では、この機能がオペレーティングシステム関連の機能を提供する os パッケージのサブパッケージとして os/exec に移動されました。

scanner パッケージ (Go 1以前)

scanner パッケージは、テキストをトークンに分割するためのシンプルなスキャナー(字句解析器)を提供していました。これは、プログラミング言語のパーサーや、特定の形式のテキストファイルを解析する際に利用される基本的なツールです。Go 1では、テキスト処理関連のパッケージをまとめるために text/scanner に移動されました。

tabwriter パッケージ (Go 1以前)

tabwriter パッケージは、テキストを整形してタブ区切りの列を揃えるための機能を提供していました。これにより、出力されるテキストの可読性を高めることができます。Go 1では、text/tabwriter に移動されました。

template パッケージ (Go 1以前)

template パッケージは、Go言語でテキストベースのテンプレートを扱うための機能を提供していました。これにより、動的にコンテンツを生成するウェブアプリケーションなどで、HTMLやプレーンテキストのテンプレートを定義し、データと組み合わせて最終的な出力を生成することができました。Go 1では、text/template に移動され、そのサブパッケージである template/parsetext/template/parse に移動されました。

utf16 パッケージ (Go 1以前)

utf16 パッケージは、UTF-16エンコーディングの文字列を扱うための機能を提供していました。Go言語の文字列は通常UTF-8でエンコードされますが、特定のシステムやプロトコルとの相互運用性のため、UTF-16の変換が必要となる場合があります。Go 1では、Unicode関連のパッケージをまとめるために unicode/utf16 に移動されました。

utf8 パッケージ (Go 1以前)

utf8 パッケージは、UTF-8エンコーディングの文字列を扱うための機能を提供していました。Go言語の文字列はUTF-8でエンコードされているため、このパッケージはUTF-8文字列の検証、ルーン(Unicodeコードポイント)への変換、バイト列からの読み取りなど、基本的なUTF-8操作を提供します。Go 1では、unicode/utf8 に移動されました。

技術的詳細

このコミットの技術的な核心は、Go標準ライブラリ内の複数のパッケージの物理的なディレクトリ移動と、それに伴うビルドシステム関連ファイルの更新です。

  1. ディレクトリ構造の変更:

    • src/pkg/exec/src/pkg/os/exec/
    • src/pkg/scanner/src/pkg/text/scanner/
    • src/pkg/tabwriter/src/pkg/text/tabwriter/
    • src/pkg/template/src/pkg/text/template/
    • src/pkg/template/parse/src/pkg/text/template/parse/
    • src/pkg/utf16/src/pkg/unicode/utf16/
    • src/pkg/utf8/src/pkg/unicode/utf8/

    これらの変更は、rename from ... rename to ... という形式でdiffに示されています。similarity index 100% は、ファイルの内容が変更されずにディレクトリのみが移動したことを意味します。Makefile のような一部のファイルでは、similarity index が100%未満であり、これはファイルの内容も変更されたことを示しています。

  2. Makefile の更新: src/pkg/Makefile は、Goの標準ライブラリ内の各パッケージのビルドを管理する主要なMakefileです。パッケージのディレクトリが変更されたため、このファイル内の DIRS 変数から古いパスが削除され、新しいパスが追加されています。 例えば、exec が削除され、os/exec が追加されています。同様に、scannertabwritertemplatetemplate/parseutf16utf8 が削除され、それぞれ text/scannertext/tabwritertext/templatetext/template/parseunicode/utf16unicode/utf8 が追加されています。

    また、各パッケージ内の Makefile (src/pkg/exec/Makefile など) も更新されています。これらのファイルは、親ディレクトリにある Make.incMake.pkg をインクルードしていましたが、パッケージの移動により相対パスが変更されたため、include ../../Make.incinclude ../../../Make.inc のように、パスの深さが調整されています。

  3. deps.bash の更新: src/pkg/deps.bash は、Goのビルドシステムがパッケージの依存関係を解決するために使用するスクリプトです。このスクリプトには、パッケージのパスパターンが定義されており、新しいパッケージ構造に合わせてこれらのパターンが更新されています。 具体的には、dirpat 変数に新しいパッケージのパスが追加され、sed コマンドによるパス変換ルールも更新されています。例えば、exec.installos/exec.install に、scanner.installtext/scanner.install に、といった変更が加えられています。これにより、ビルドシステムが新しいパッケージの場所を正しく認識し、依存関係を解決できるようになります。

このコミットは、ソースコードの物理的な配置を変更するものであり、Go 1の安定したAPI設計に向けた重要なステップでした。この時点ではインポートパス自体は変更されていませんが、物理的な移動が完了したことで、後続のコミットでインポートパスの変更が可能になります。

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

このコミットにおけるコアとなるコードの変更は、主に以下のパッケージのディレクトリ移動と、それに伴うビルド設定ファイルの更新です。

  1. exec パッケージの移動:

    • src/pkg/exec/Makefile -> src/pkg/os/exec/Makefile
    • src/pkg/exec/exec.go -> src/pkg/os/exec/exec.go
    • src/pkg/exec/exec_test.go -> src/pkg/os/exec/exec_test.go
    • src/pkg/exec/lp_plan9.go -> src/pkg/os/exec/lp_plan9.go
    • src/pkg/exec/lp_test.go -> src/pkg/os/exec/lp_test.go
    • src/pkg/exec/lp_unix.go -> src/pkg/os/exec/lp_unix.go
    • src/pkg/exec/lp_windows.go -> src/pkg/os/exec/lp_windows.go
  2. scanner パッケージの移動:

    • src/pkg/scanner/Makefile -> src/pkg/text/scanner/Makefile
    • src/pkg/scanner/scanner.go -> src/pkg/text/scanner/scanner.go
    • src/pkg/scanner/scanner_test.go -> src/pkg/text/scanner/scanner_test.go
  3. tabwriter パッケージの移動:

    • src/pkg/tabwriter/Makefile -> src/pkg/text/tabwriter/Makefile
    • src/pkg/tabwriter/tabwriter.go -> src/pkg/text/tabwriter/tabwriter.go
    • src/pkg/tabwriter/tabwriter_test.go -> src/pkg/text/tabwriter/tabwriter_test.go
  4. template パッケージの移動:

    • src/pkg/template/Makefile -> src/pkg/text/template/Makefile
    • src/pkg/template/doc.go -> src/pkg/text/template/doc.go
    • src/pkg/template/exec.go -> src/pkg/text/template/exec.go
    • src/pkg/template/exec_test.go -> src/pkg/text/template/exec_test.go
    • src/pkg/template/funcs.go -> src/pkg/text/template/funcs.go
    • src/pkg/template/helper.go -> src/pkg/text/template/helper.go
    • src/pkg/template/parse.go -> src/pkg/text/template/parse.go
    • src/pkg/template/set.go -> src/pkg/text/template/set.go
    • src/pkg/template/set_test.go -> src/pkg/text/template/set_test.go
    • src/pkg/template/testdata/file1.tmpl -> src/pkg/text/template/testdata/file1.tmpl
    • src/pkg/template/testdata/file2.tmpl -> src/pkg/text/template/testdata/file2.tmpl
    • src/pkg/template/testdata/tmpl1.tmpl -> src/pkg/text/template/testdata/tmpl1.tmpl
    • src/pkg/template/testdata/tmpl2.tmpl -> src/pkg/text/template/testdata/tmpl2.tmpl
  5. template/parse サブパッケージの移動:

    • src/pkg/template/parse/Makefile -> src/pkg/text/template/parse/Makefile
    • src/pkg/template/parse/lex.go -> src/pkg/text/template/parse/lex.go
    • src/pkg/template/parse/lex_test.go -> src/pkg/text/template/parse/lex_test.go
    • src/pkg/template/parse/node.go -> src/pkg/text/template/parse/node.go
    • src/pkg/template/parse/parse.go -> src/pkg/text/template/parse/parse.go
    • src/pkg/template/parse/parse_test.go -> src/pkg/text/template/parse/parse_test.go
    • src/pkg/template/parse/set.go -> src/pkg/text/template/parse/set.go
  6. utf16 パッケージの移動:

    • src/pkg/utf16/Makefile -> src/pkg/unicode/utf16/Makefile
    • src/pkg/utf16/utf16.go -> src/pkg/unicode/utf16/utf16.go
    • src/pkg/utf16/utf16_test.go -> src/pkg/unicode/utf16/utf16_test.go
  7. utf8 パッケージの移動:

    • src/pkg/utf8/Makefile -> src/pkg/unicode/utf8/Makefile
    • src/pkg/utf8/string.go -> src/pkg/unicode/utf8/string.go
    • src/pkg/utf8/string_test.go -> src/pkg/unicode/utf8/string_test.go
    • src/pkg/utf8/utf8.go -> src/pkg/unicode/utf8/utf8.go
    • src/pkg/utf8/utf8_test.go -> src/pkg/unicode/utf8/utf8_test.go

これらのファイル移動に伴い、src/pkg/Makefilesrc/pkg/deps.bash が更新され、新しいパッケージパスが反映されています。

コアとなるコードの解説

このコミットで行われた変更は、Go言語の標準ライブラリの構造をより論理的かつ整理されたものにするための重要なステップでした。各パッケージの移動は、その機能が属するより広範なカテゴリ(例: オペレーティングシステム、テキスト処理、Unicode)の下に配置するという設計原則に基づいています。

  • exec から os/exec: exec パッケージは外部プロセスを実行する機能を提供しますが、これはオペレーティングシステムと密接に関連する機能です。os パッケージはファイルシステム、プロセス、環境変数など、OSレベルの機能を提供するため、exec をそのサブパッケージとすることで、関連する機能が os 名前空間の下に集約され、より一貫性のあるAPI設計が実現されます。

  • scanner, tabwriter, template から text/scanner, text/tabwriter, text/template: これらのパッケージはすべてテキストの解析、整形、生成といったテキスト処理に関連する機能を提供します。これらを text という共通の親パッケージの下に配置することで、Goの標準ライブラリを利用する開発者は、テキスト関連の機能を探す際に text パッケージを参照すればよいという直感的な理解が得られます。これにより、パッケージの発見可能性と使いやすさが向上します。

  • utf16, utf8 から unicode/utf16, unicode/utf8: utf16utf8 は、それぞれUTF-16とUTF-8という特定のUnicodeエンコーディングを扱うパッケージです。これらを unicode パッケージのサブパッケージとすることで、Goが提供するUnicode関連のすべての機能が unicode 名前空間の下に集約されます。これにより、Unicodeの正規化、文字プロパティ、エンコーディング変換など、より広範なUnicode処理の文脈でこれらのパッケージが位置づけられ、標準ライブラリの構造がより明確になります。

このコミットの時点では、ソースコードの物理的な移動のみが行われ、Goプログラム内でこれらのパッケージをインポートする際の文字列(例: import "exec")はまだ変更されていませんでした。コミットメッセージにもあるように、「インポート文字列は次回の週次リリース後に変更される」と明記されています。これは、大規模な変更を段階的に適用し、各ステップでの影響を最小限に抑えるための戦略です。物理的な移動が完了した後、Goのビルドツールや開発環境が新しいパスを認識できるようになり、その後にインポートパスの変更が行われることで、開発者は go fix ツールなどを使用して既存のコードを容易に更新できるようになります。

この再編成は、Go 1のリリースにおける「安定性」という重要な目標を達成するために不可欠なものでした。これにより、Goの標準ライブラリは、将来にわたって堅牢で、拡張性があり、かつ理解しやすい基盤を持つことになりました。

関連リンク

参考にした情報源リンク