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

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

このコミットは、Go言語のビルドシステムにおける依存関係テストファイル src/pkg/go/build/deps_test.go の修正に関するものです。具体的には、Plan 9オペレーティングシステムにおける os/user パッケージの依存関係の調整と、新しく追加された image/color/palette パッケージの依存関係の組み込みが行われています。

コミット

commit 2df3d800378fda123395609189fabdd403634d80
Author: Nigel Tao <nigeltao@golang.org>
Date:   Fri Aug 30 17:12:42 2013 +1000

    go/build: fix deps_test for Plan 9's os/user dependencies and to
    include the new image/color/palette package.
    
    R=r
    CC=golang-dev
    https://golang.org/cl/13314044

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

https://github.com/golang/go/commit/2df3d800378fda123395609189fabdd403634d80

元コミット内容

このコミットは、src/pkg/go/build/deps_test.go ファイルに対して以下の変更を加えています。

  1. image/color/palette パッケージの依存関係を pkgDeps マップに追加。
  2. L3 レベルのパッケージリストに image/color/palette を追加。
  3. image/gif パッケージの依存関係に image/color/palette を追加。
  4. Plan 9環境における os/user パッケージの依存関係に io/ioutilos を追加。

変更の背景

このコミットの背景には、主に以下の2つの要因があります。

  1. image/color/palette パッケージの導入: Go言語の標準ライブラリに image/color/palette パッケージが新しく追加されたことに伴い、その依存関係をビルドシステムのテストに反映させる必要がありました。特に、GIF画像はパレットベースの色表現を使用するため、image/gif パッケージがこの新しいパレットパッケージに依存することは自然な流れです。
  2. Plan 9における os/user の特殊な依存関係: Plan 9は、Go言語がサポートするオペレーティングシステムの一つですが、他のOSとは異なるシステムコールやライブラリの依存関係を持つことがあります。os/user パッケージはユーザー情報を取得するためのものですが、Plan 9環境ではその実装が io/ioutilos パッケージに依存していることが判明し、これを deps_test.go に正確に反映させる必要がありました。これは、クロスプラットフォーム対応におけるOS固有の差異を吸収するための重要な修正です。

これらの変更は、Goのビルドシステムがパッケージ間の依存関係を正確に把握し、異なるプラットフォーム上でも正しく動作することを保証するために行われました。

前提知識の解説

このコミットを理解するためには、以下の前提知識が役立ちます。

  • Go言語のパッケージシステム: Go言語は、コードをパッケージという単位で管理します。各パッケージは、他のパッケージに依存することができます。ビルドプロセスでは、これらの依存関係が解決され、必要なパッケージがコンパイル・リンクされます。
  • go/build パッケージ: Go言語の標準ライブラリの一部であり、Goのソースコードのビルドに関する情報(パッケージの解決、依存関係の解析など)を提供します。このコミットで変更されている deps_test.go は、この go/build パッケージのテストファイルであり、Goのビルドシステムがパッケージの依存関係を正しく処理しているかを検証するために使用されます。
  • deps_test.go の役割: このテストファイルは、pkgDeps というマップを定義しています。このマップは、Goの標準ライブラリ内の各パッケージが、どの「レベル」(L2, L3, L4など)のパッケージに依存しているか、そして具体的な他のパッケージに依存しているかを記述しています。このテストは、実際のパッケージの依存関係がこの定義と一致していることを確認することで、ビルドシステムの健全性を保ちます。
  • image パッケージ群: Go言語の標準ライブラリには、画像処理を行うための image パッケージとそのサブパッケージ(例: image/color, image/gif)があります。
    • image/color: 色の表現と変換に関するインターフェースと実装を提供します。
    • image/color/palette: 新しく追加されたパッケージで、色パレット(限られた数の色で画像を表現するための色の集合)を扱う機能を提供します。GIFなどのインデックスカラー画像形式で特に重要です。
  • os/user パッケージ: オペレーティングシステムからユーザー情報を取得するためのパッケージです。ユーザー名、UID、GIDなどの情報を取得できます。
  • Plan 9: ベル研究所で開発された分散オペレーティングシステムです。Go言語は、Linux、macOS、Windowsなどと同様にPlan 9もサポートしており、クロスプラットフォーム開発においてPlan 9固有の挙動を考慮する必要があります。
  • io/ioutilos パッケージ:
    • io/ioutil: 入出力操作に関するユーティリティ関数を提供します。ファイルからの読み込みや書き込み、一時ファイルの作成など。
    • os: オペレーティングシステムとのインタラクション(ファイルシステム操作、プロセス管理、環境変数など)を提供します。

技術的詳細

このコミットの技術的詳細は、deps_test.go ファイル内の pkgDeps マップの変更に集約されます。

pkgDeps マップは、Goの標準ライブラリ内の各パッケージが持つべき依存関係を定義するものです。このマップは、Goのビルドシステムがパッケージの依存関係を正しく解決できるかをテストするために使用されます。

image/color/palette の追加

image/color/palette パッケージが新しく導入されたため、その依存関係が pkgDeps に追加されました。

  • "image/color/palette": {"L2", "image/color"},:
    • これは、image/color/palette パッケージが、基本的なパッケージ群である L2 と、色の定義を扱う image/color パッケージに依存することを示しています。これは、パレットが色の概念に基づいているため、論理的な依存関係です。
  • L3 レベルへの追加:
    • L3 は、L2 に加えて反射(reflect)やハッシュ(hash)などのより高度な機能を含むパッケージの集合を指します。image/color/paletteL3 に追加されたのは、このパッケージがGoの標準ライブラリのより広範な機能セットの一部として認識され、他の L3 レベルのパッケージと同様に扱われるべきであることを示唆しています。
  • image/gif の依存関係への追加:
    • "image/gif": {"L4", "compress/lzw", "image/color/palette", "image/draw"},
    • GIF画像はインデックスカラー形式であり、色パレットを使用します。したがって、image/gif パッケージが image/color/palette に依存することは、GIF画像のエンコード/デコード処理においてパレット情報が必要となるため、非常に理にかなっています。この変更により、image/gif が正しくビルドされるために image/color/palette が利用可能であることをビルドシステムが認識するようになります。

Plan 9における os/user の依存関係の修正

Plan 9環境における os/user パッケージの依存関係が修正されました。

  • 変更前: "os/user": {"L4", "CGO", "syscall"},
    • これは、os/userL4(システムコールやCGOを含む最上位レベルのパッケージ群)、CGO(C言語との連携)、および syscall(システムコール)に依存することを示していました。
  • 変更後: "os/user": {"L4", "CGO", "io/ioutil", "os", "syscall"},
    • 新しい行には、io/ioutilos パッケージが追加されています。これは、Plan 9オペレーティングシステム上での os/user パッケージの実装が、ファイルシステム操作(os)や入出力ユーティリティ(io/ioutil)を内部的に使用しているためです。Goのクロスプラットフォーム設計では、各OSの特性に合わせてパッケージの実装が異なることがあり、この変更はその一例です。deps_test.go は、このようなOS固有の依存関係も正確に反映することで、各プラットフォームでのビルドの整合性を保証します。

これらの変更は、Goのビルドシステムが、新しいパッケージの導入や特定のOS環境におけるパッケージの特殊な依存関係を正確に処理できるようにするための、保守的ながらも重要な更新です。

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

変更は src/pkg/go/build/deps_test.go ファイルに集中しています。

--- a/src/pkg/go/build/deps_test.go
+++ b/src/pkg/go/build/deps_test.go
@@ -82,20 +82,21 @@ var pkgDeps = map[string][]string{\
  	// L3 adds reflection and some basic utility packages
  	// and interface definitions, but nothing that makes
  	// system calls.
-	"crypto":          {"L2", "hash"},          // interfaces
-	"crypto/cipher":   {"L2", "crypto/subtle"}, // interfaces
-	"crypto/subtle":   {},\n-	"encoding/base32": {"L2"},\n-	"encoding/base64": {"L2"},\n-	"encoding/binary": {"L2", "reflect"},\n-	"hash":            {"L2"}, // interfaces\n-	"hash/adler32":    {"L2", "hash"},\n-	"hash/crc32":      {"L2", "hash"},\n-	"hash/crc64":      {"L2", "hash"},\n-	"hash/fnv":        {"L2", "hash"},\n-	"image":           {"L2", "image/color"}, // interfaces\n-	"image/color":     {"L2"},                // interfaces\n-	"reflect":         {"L2"},\n+	"crypto":              {"L2", "hash"},          // interfaces
+	"crypto/cipher":       {"L2", "crypto/subtle"}, // interfaces
+	"crypto/subtle":       {},\n+	"encoding/base32":     {"L2"},\n+	"encoding/base64":     {"L2"},\n+	"encoding/binary":     {"L2", "reflect"},\n+	"hash":                {"L2"}, // interfaces\n+	"hash/adler32":        {"L2", "hash"},\n+	"hash/crc32":          {"L2", "hash"},\n+	"hash/crc64":          {"L2", "hash"},\n+	"hash/fnv":            {"L2", "hash"},\n+	"image":               {"L2", "image/color"}, // interfaces
+	"image/color":         {"L2"},                // interfaces
+	"image/color/palette": {"L2", "image/color"},\n+	"reflect":             {"L2"},\
 \n 	"L3": {\n  		"L2",\n@@ -112,6 +113,7 @@ var pkgDeps = map[string][]string{\n  		"hash/fnv",\n  		"image",\n  		"image/color",\n+\t\t"image/color/palette",\n  		"reflect",\n  	},\n \n@@ -205,7 +207,7 @@ var pkgDeps = map[string][]string{\n  	"go/build":            {"L4", "OS", "GOPARSER"},\n  	"html":                {"L4"},\n  	"image/draw":          {"L4"},\n-\t"image/gif":           {"L4", "compress/lzw", "image/draw"},\n+\t"image/gif":           {"L4", "compress/lzw", "image/color/palette", "image/draw"},\n  	"image/jpeg":          {"L4"},\n  	"image/png":           {"L4", "compress/zlib"},\n  	"index/suffixarray":   {"L4", "regexp"},\
@@ -231,7 +233,8 @@ var pkgDeps = map[string][]string{\n  	// that shows up in programs that use cgo.\n  	"C": {},\n \n-\t"os/user": {"L4", "CGO", "syscall"},\n+\t// Plan 9 alone needs io/ioutil and os.\n+\t"os/user": {"L4", "CGO", "io/ioutil", "os", "syscall"},\
 \n  	// Basic networking.\n  	// Because net must be used by any package that wants to\n```

## コアとなるコードの解説

上記の差分は、`pkgDeps` という `map[string][]string` 型の変数に対する変更を示しています。このマップは、Goの標準ライブラリ内の各パッケージ名(キー)と、そのパッケージが依存する他のパッケージのリスト(値)を関連付けています。

1.  **`image/color/palette` の追加**:
    *   `"image/color/palette": {"L2", "image/color"},` という行が追加されました。これは、`image/color/palette` パッケージが、基本的な依存関係のセットである `L2` と、`image/color` パッケージに依存することを宣言しています。
    *   `L3` の依存関係リストに `"image/color/palette",` が追加されました。これは、`image/color/palette` が `L3` レベルのパッケージとして認識されることを意味します。
    *   `"image/gif"` の依存関係リストが `"image/gif": {"L4", "compress/lzw", "image/draw"},` から `"image/gif": {"L4", "compress/lzw", "image/color/palette", "image/draw"},` に変更されました。これにより、`image/gif` が `image/color/palette` に依存することが明示され、GIF画像の処理に必要なパレット機能が正しく解決されるようになります。

2.  **`os/user` の Plan 9 固有の依存関係の修正**:
    *   `"os/user": {"L4", "CGO", "syscall"},` という行が削除され、代わりに `// Plan 9 alone needs io/ioutil and os.` というコメントと共に、`"os/user": {"L4", "CGO", "io/ioutil", "os", "syscall"},` という行が追加されました。
    *   この変更は、Plan 9オペレーティングシステム上での `os/user` パッケージの動作に必要な追加の依存関係(`io/ioutil` と `os`)を反映しています。これは、Goのビルドシステムが、特定のOS環境におけるパッケージの特殊な依存関係を正確に処理できるようにするためのものです。

これらの変更は、Goのビルドシステムがパッケージ間の依存関係を正確に把握し、特に新しいパッケージの導入や特定のプラットフォームでの動作の差異に対応するための、テスト定義の更新です。

## 関連リンク

*   Go言語の公式ドキュメント: [https://golang.org/doc/](https://golang.org/doc/)
*   Go言語の `image` パッケージ: [https://pkg.go.dev/image](https://pkg.go.dev/image)
*   Go言語の `os/user` パッケージ: [https://pkg.go.dev/os/user](https://pkg.go.dev/os/user)
*   Go言語の `go/build` パッケージ: [https://pkg.go.dev/go/build](https://pkg.go.dev/go/build)
*   Plan 9 from Bell Labs: [https://9p.io/plan9/](https://9p.io/plan9/)

## 参考にした情報源リンク

*   Go言語のソースコードリポジトリ (GitHub): [https://github.com/golang/go](https://github.com/golang/go)
*   Go Code Review Comments (CL 13314044): [https://golang.org/cl/13314044](https://golang.org/cl/13314044) (コミットメッセージに記載されているCLリンク)
*   Go言語のパッケージと依存関係に関する一般的な情報源 (例: Go Modulesに関するドキュメントなど)
*   Plan 9オペレーティングシステムに関する一般的な情報源 (例: Wikipediaなど)