[インデックス 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チームはコアの安定性を保ちつつ、特定の機能の進化を加速させる戦略を採用していました。