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

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

このコミットは、Go言語の標準ライブラリの一部であった go/types パッケージを、メインのリポジトリから実験的な go.exp リポジトリへ移動する作業の一環として、既存のコードベースから削除するものです。これにより、go/types パッケージはGoのコア配布物から分離され、独立した開発サイクルを持つことになります。

コミット

  • コミットハッシュ: 4ce79096b6a88051bd1253672593f07ce0234155
  • Author: Rob Pike r@golang.org
  • Date: Tue Mar 12 13:55:58 2013 -0700

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

https://github.com/golang/go/commit/4ce79096b6a88051bd1253672593f07ce0234155

元コミット内容

go/types: delete from main repo; part of move to go.exp
See also https://golang.org/cl/7656044

R=golang-dev, gri, rsc
CC=golang-dev
https://golang.org/cl/7625048

変更の背景

このコミットの背景には、Go言語の進化におけるパッケージ管理と安定性の戦略があります。go/types パッケージは、Goプログラムの型チェックを行うための重要なコンポーネントであり、当初はGoのメインリポジトリの一部として開発されていました。しかし、Go言語の成長に伴い、一部のパッケージはより迅速なイテレーションや実験的な開発が必要とされるようになりました。

golang.org/x/exp は、Goチームが新しいアイデアや実験的なAPIを試すためのリポジトリ群です。このリポジトリ内のパッケージは、Go 1の互換性保証の対象外であり、APIが変更されたり、削除されたりする可能性があります。go/typesgo.exp に移動することで、Goチームは go/types の開発をより柔軟に進めることができ、Go言語の進化に合わせて型システムや型チェックの機能を改善していくことが可能になります。

この移動は、go vet などのツールが go/types に依存しているため、一時的な影響を伴います。コミットメッセージにある See also https://golang.org/cl/7656044 は、この移動に関連する別の変更リスト(Change List)を示しており、おそらく go/types の新しい場所への参照を更新したり、依存関係を調整したりする内容が含まれていると推測されます。

前提知識の解説

go/types パッケージ

go/types パッケージは、Go言語のソースコードを解析し、その型情報を構築するためのライブラリです。具体的には、以下のような機能を提供します。

  • 型チェック: Goプログラムが型規則に準拠しているかを確認します。例えば、異なる型の値を代入しようとしたり、存在しないメソッドを呼び出したりするエラーを検出します。
  • 型情報の提供: 変数、関数、構造体などのGo言語の要素がどのような型を持っているか、その型の内部構造(フィールド、メソッドなど)はどうなっているかといった情報を提供します。
  • AST (Abstract Syntax Tree) との連携: go/ast パッケージが生成する抽象構文木を基に、型情報を付与します。

このパッケージは、コンパイラ、リンター(go vet など)、IDE、コード分析ツールなど、Go言語のコードを扱う多くのツールで利用されています。

golang.org/x/exp リポジトリ

golang.org/x/exp は、Go言語の公式な実験的リポジトリです。このリポジトリには、Goの将来のバージョンに組み込まれる可能性のある新しいAPI、パッケージ、ツールなどが含まれています。go.exp 内のパッケージは、Go 1の互換性保証の対象外であり、APIの変更、削除、または大幅な改訂が頻繁に行われる可能性があります。これは、Goチームが新しいアイデアを迅速に試行し、コミュニティからのフィードバックを収集するためのサンドボックスとして機能します。

go vet ツール

go vet は、Goプログラムの潜在的なバグや疑わしい構造を検出するための静的解析ツールです。例えば、以下のような問題を検出できます。

  • Printf フォーマット文字列と引数の不一致
  • 到達不能なコード
  • ロックの誤用
  • 構造体タグの誤り

go vet は、コードの実行なしにこれらの問題を特定できるため、開発プロセスの早期段階でバグを発見し、品質を向上させるのに役立ちます。go vet は、その機能の一部として go/types パッケージを利用して、コードの型情報を取得し、より高度な解析を実行します。

技術的詳細

このコミットは、go/types パッケージをメインリポジトリから go.exp へ移動するプロセスの一部です。この移動は、Goのビルドシステムと go vet ツールに直接的な影響を与えます。

  1. go/types の削除: src/pkg/go/types ディレクトリ以下のすべてのファイルが削除されています。これは、go/types がGoの標準ライブラリの一部ではなくなり、外部の依存関係として扱われることを意味します。

  2. go vet の変更:

    • src/cmd/vet/types.go ファイルでは、go/types のインポートパスが go/types から code.google.com/p/go.exp/go/types に変更されています。これは、go vet が新しい場所から go/types パッケージをインポートするように指示するものです。
    • また、このファイルには新しいコメントが追加されており、go vet をコンパイルするためには、まず go get code.google.com/p/go.exp/go/types を実行して go.exp から go/types を取得する必要があることが明記されています。これは、go/types がGoの配布物に含まれなくなったため、明示的にダウンロードする必要があることを示しています。
    • // +build gotypes というビルドタグが残されています。これは、go vet の一部の機能が go/types に依存していることを示唆しており、gotypes タグが有効な場合にのみコンパイルされるように制御されています。
  3. ビルドスクリプトの変更 (src/make.bash, src/make.bat):

    • make.bash (Linux/macOS向け) および make.bat (Windows向け) のビルドスクリプトから、go_bootstrap install コマンドに渡されていた -tags gotypes オプションが削除されています。
    • 以前は、go vet の型チェック機能を有効にするために、Go 1.1のリリース前に一時的にこのタグが使用されていました。このコミットにより、go/typesgo.exp に移動したため、この一時的な措置が不要になったことを示しています。つまり、go vet のビルドは、もはやメインリポジトリ内の go/types に依存しないため、特別なビルドタグは必要ありません。代わりに、go vetgo.exp から go/types を取得するようになります。

これらの変更は、go/types パッケージがGoのコア配布物から切り離され、独立した開発と配布のライフサイクルを持つようになったことを明確に示しています。これにより、Goのコアはより安定し、go/types はより柔軟に進化できるようになります。

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

このコミットでは、主に以下のファイルが変更されています。

  1. src/cmd/vet/types.go: go vet ツールが go/types パッケージをインポートする方法が変更されました。
  2. src/make.bash: Goのビルドスクリプト(Bash版)から、go/types 関連のビルドタグが削除されました。
  3. src/make.bat: Goのビルドスクリプト(Batch版)から、go/types 関連のビルドタグが削除されました。
  4. src/pkg/go/types/ ディレクトリ以下のすべてのファイル: go/types パッケージのソースコードがメインリポジトリから削除されました。

具体的な変更は以下の通りです。

src/cmd/vet/types.go

--- a/src/cmd/vet/types.go
+++ b/src/cmd/vet/types.go
@@ -5,13 +5,16 @@
 // +build gotypes
 
 // This file contains the pieces of the tool that require the go/types package.
+// To compile this file, you must first run
+//  $ go get code.google.com/p/go.exp/go/types
 
 package main
 
 import (
 	"go/ast"
 	"go/token"
-	"go/types"
+
+	"code.google.com/p/go.exp/go/types"
 )
 
 // Type is equivalent to go/types.Type. Repeating it here allows us to avoid

src/make.bash

--- a/src/make.bash
+++ b/src/make.bash
@@ -134,15 +134,14 @@ echo
 
 if [ "$GOHOSTARCH" != "$GOARCH" -o "$GOHOSTOS" != "$GOOS" ]; then
 	echo "# Building packages and commands for host, $GOHOSTOS/$GOHOSTARCH."
-	# TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
 	GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH \
-		"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -tags gotypes -v std
+		"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
 	echo
 fi
 
 echo "# Building packages and commands for $GOOS/$GOARCH."
 # TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
-"$GOTOOLDIR"/go_bootstrap install $GO_FLAGS -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -tags gotypes -v std
+"$GOTOOLDIR"/go_bootstrap install $GO_FLAGS -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
 echo
 
 rm -f "$GOTOOLDIR"/go_bootstrap

src/make.bat

--- a/src/make.bat
+++ b/src/make.bat
@@ -90,16 +90,14 @@ echo # Building tools for local system. %GOHOSTOS%/%GOHOSTARCH%
 setlocal
 set GOOS=%GOHOSTOS%
 set GOARCH=%GOHOSTARCH%
-:: TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
-"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -tags gotypes -v std
+"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std
 endlocal
 if errorlevel 1 goto fail
 echo.
 
 :mainbuild
 echo # Building packages and commands.
-:: TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
-"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -tags gotypes -v std
+"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -v std
 if errorlevel 1 goto fail
 del "%GOTOOLDIR%\go_bootstrap.exe"
 echo.

src/pkg/go/types/ ディレクトリ以下の削除

src/pkg/go/types/ ディレクトリ内のすべてのファイル(api.go, builtins.go, check.go, check_test.go, const.go など、合計40以上のファイル)が削除されています。これは、go/types パッケージがGoのメインリポジトリから完全に削除されたことを意味します。

コアとなるコードの解説

src/cmd/vet/types.go の変更

  • インポートパスの変更:
    • import "go/types"import "code.google.com/p/go.exp/go/types" に変更されました。これは、go vetgo/types パッケージをGoの標準ライブラリからではなく、go.exp リポジトリから取得するように指示しています。
    • code.google.com/p/go.exp/go/types は、当時のGoの外部パッケージの慣習的なパスでした。現在では golang.org/x/tools/go/types のようなパスが使われますが、これは当時のGoのバージョンにおける適切な変更です。
  • コメントの追加:
    • // To compile this file, you must first run
    • // $ go get code.google.com/p/go.exp/go/types
    • このコメントは、go vet をビルドする際に、ユーザーが手動で go get コマンドを実行して go.exp/go/types パッケージをダウンロードする必要があることを明確に示しています。これは、go/types がGoの配布物に含まれなくなったため、ビルド時に外部から取得する必要が生じたためです。

src/make.bash および src/make.bat の変更

  • -tags gotypes オプションの削除:
    • go_bootstrap install コマンドから -tags gotypes オプションが削除されました。
    • この -tags gotypes は、Go 1.1のリリース前に go vet の型チェック機能を有効にするための一時的な措置として導入されていました。go/types がメインリポジトリから go.exp に移動したことで、このタグは不要になりました。
    • ビルドシステムは、もはやメインリポジトリ内の go/types に依存しないため、特別なビルドタグを必要としません。go vet は、自身の types.go ファイルのインポートパスに従って、go.exp から go/types を取得するようになります。

src/pkg/go/types/ ディレクトリ以下の削除

  • このディレクトリ内のすべてのファイルが削除されたことは、go/types パッケージがGoのメインリポジトリから物理的に削除されたことを意味します。これにより、Goのコア配布物のサイズが削減され、go/types の開発は独立したリポジトリで行われるようになります。

これらの変更は、Go言語のモジュールシステムが導入される前の、Goのパッケージ管理と依存関係解決の過渡期における重要なステップを示しています。go/types のような重要なコンポーネントを実験的なリポジトリに移動することで、Goチームはコアの安定性を保ちつつ、特定の機能の進化を加速させる戦略を採用していました。

関連リンク

参考にした情報源リンク