[インデックス 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/types を go.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 ツールに直接的な影響を与えます。
-
go/typesの削除:src/pkg/go/typesディレクトリ以下のすべてのファイルが削除されています。これは、go/typesがGoの標準ライブラリの一部ではなくなり、外部の依存関係として扱われることを意味します。 -
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タグが有効な場合にのみコンパイルされるように制御されています。
-
ビルドスクリプトの変更 (
src/make.bash,src/make.bat):make.bash(Linux/macOS向け) およびmake.bat(Windows向け) のビルドスクリプトから、go_bootstrap installコマンドに渡されていた-tags gotypesオプションが削除されています。- 以前は、
go vetの型チェック機能を有効にするために、Go 1.1のリリース前に一時的にこのタグが使用されていました。このコミットにより、go/typesがgo.expに移動したため、この一時的な措置が不要になったことを示しています。つまり、go vetのビルドは、もはやメインリポジトリ内のgo/typesに依存しないため、特別なビルドタグは必要ありません。代わりに、go vetはgo.expからgo/typesを取得するようになります。
これらの変更は、go/types パッケージがGoのコア配布物から切り離され、独立した開発と配布のライフサイクルを持つようになったことを明確に示しています。これにより、Goのコアはより安定し、go/types はより柔軟に進化できるようになります。
コアとなるコードの変更箇所
このコミットでは、主に以下のファイルが変更されています。
src/cmd/vet/types.go:go vetツールがgo/typesパッケージをインポートする方法が変更されました。src/make.bash: Goのビルドスクリプト(Bash版)から、go/types関連のビルドタグが削除されました。src/make.bat: Goのビルドスクリプト(Batch版)から、go/types関連のビルドタグが削除されました。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 vetがgo/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チームはコアの安定性を保ちつつ、特定の機能の進化を加速させる戦略を採用していました。