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

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

このコミットは、Go言語の公式リポジトリにおいて、静的解析ツールである cmd/vet を削除するものです。vet ツールは、Goのコードベースから独立した go.tools サブリポジトリへ移行されました。

コミット

commit 249842c8dbb90b9d286499d052ebd8fd633bd132
Author: Rob Pike <r@golang.org>
Date:   Fri May 17 13:53:22 2013 -0700

    cmd/vet: delete; it now lives in the go.tools subrepo
    
    R=golang-dev, dsymonds, rsc, iant, dave
    CC=golang-dev
    https://golang.org/cl/9496043

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

https://github.com/golang/go/commit/249842c8dbb90b9d286499d052ebd8fd633bd132

元コミット内容

cmd/vet: delete; it now lives in the go.tools subrepo

変更の背景

このコミットの背景には、Go言語のエコシステムにおけるツールの管理と配布の進化があります。vet はGoのコードの潜在的な問題を検出するための重要な静的解析ツールですが、Goの標準ライブラリやコンパイラとは異なり、その開発サイクルや依存関係は独立していることが望ましいと判断されました。

Goプロジェクトでは、主要なGoディストリビューションとは別に、関連するツールやライブラリを go.tools サブリポジトリ(後に golang.org/x/tools となる)に集約する方針が採用されました。これにより、以下のメリットが期待されました。

  1. 独立した開発とリリースサイクル: vet のようなツールは、Go言語本体のリリースサイクルに縛られることなく、独立して機能追加やバグ修正を行うことができるようになります。
  2. 依存関係の明確化: Go本体のビルドやテストから vet のコードを分離することで、Go本体の依存関係をシンプルに保ち、ビルド時間を短縮できます。
  3. モジュール性の向上: ツールが独立したパッケージとして提供されることで、他のプロジェクトが vet の機能をライブラリとして利用しやすくなります。
  4. ユーザーへの提供方法の柔軟性: go get コマンドを通じて、ユーザーは必要に応じて特定のツールのみをインストールできるようになります。

このコミットは、このようなGoエコシステムのモジュール化と分散化の初期段階の一部として行われました。

前提知識の解説

  • go vet コマンド: go vet はGo言語のソースコードを静的に解析し、疑わしい構造や潜在的なバグを報告するツールです。例えば、fmt.Printf のフォーマット文字列と引数の不一致、到達不能なコード、アトミック操作の誤用などを検出します。コンパイラでは検出できないが、実行時に問題を引き起こす可能性のあるパターンを見つけるのに役立ちます。
  • Go Modules (当時はまだ存在しない概念): このコミットが行われた2013年時点では、Go Modulesはまだ存在しませんでした。Goの依存関係管理は主に GOPATH に依存しており、サードパーティのライブラリやツールは go get を使って GOPATH 内にダウンロードされていました。go.tools サブリポジトリへの移行は、後のGo Modulesの思想にも通じる、依存関係の分離と管理の改善に向けた一歩と見なすことができます。
  • go.tools サブリポジトリ (現在の golang.org/x/tools): Goプロジェクトでは、標準ライブラリやコンパイラ以外の公式ツールやライブラリを管理するために、golang.org/x/ プレフィックスを持つサブリポジトリ群を導入しました。go.tools はその一つで、vet の他にも goimportsgorename など、Go開発を支援する様々なツールが含まれています。これらのサブリポジトリは、Go本体とは異なるバージョン管理とリリースサイクルを持ちます。
  • 静的解析: プログラムを実行せずにソースコードを分析し、潜在的なエラー、バグ、またはスタイル違反を特定するプロセスです。go vet は静的解析ツールの一例です。

技術的詳細

このコミットは、src/cmd/vet ディレクトリとその内容をGoのメインリポジトリから完全に削除するという、非常に直接的な変更です。具体的には、vet ツールを構成していた以下のファイル群が削除されています。

  • src/cmd/vet/Makefile: vet ツールのビルド設定ファイル。
  • src/cmd/vet/asmdecl.go: アセンブリコードとGoの関数宣言の不一致をチェックするロジック。
  • src/cmd/vet/assign.go: 無意味な代入をチェックするロジック。
  • src/cmd/vet/atomic.go: sync/atomic パッケージの誤用をチェックするロジック。
  • src/cmd/vet/buildtag.go: ビルドタグの正当性をチェックするロジック。
  • src/cmd/vet/deadcode.go: 到達不能なコードをチェックするロジック。
  • src/cmd/vet/doc.go: vet ツールのドキュメント。
  • src/cmd/vet/main.go: vet ツールのメインエントリポイントとコマンドライン引数処理。
  • src/cmd/vet/method.go: 標準的なメソッドシグネチャのチェックロジック。
  • src/cmd/vet/print.go: Printf 系関数のフォーマット文字列と引数の不一致をチェックするロジック。
  • src/cmd/vet/rangeloop.go: range ループ変数の誤用をチェックするロジック。
  • src/cmd/vet/structtag.go: 構造体タグのフォーマットをチェックするロジック。
  • src/cmd/vet/taglit.go: タグ付きリテラルのチェックロジック。
  • src/cmd/vet/types.go: 型チェック関連のユーティリティ。
  • src/cmd/vet/typestub.go: 型スタブ関連のユーティリティ。
  • src/cmd/vet/test_*.go, src/cmd/vet/test_*.s: vet ツールの各種テストファイル。

これらのファイルは、Goのメインリポジトリから削除された後、golang.org/x/tools/cmd/vet に移動され、そこで独立して開発・保守されることになります。この変更は、Goのメインリポジトリの肥大化を防ぎ、各コンポーネントの責任範囲を明確にするためのアーキテクチャ上の決定を反映しています。

ユーザーは今後 go get golang.org/x/tools/cmd/vet を実行することで vet ツールをインストールできるようになります。

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

このコミットは、既存のコードを削除するものであり、新しいコードの追加や既存コードの変更は含まれていません。

削除されたファイルは以下の通りです。

  • src/cmd/vet/Makefile
  • src/cmd/vet/asmdecl.go
  • src/cmd/vet/assign.go
  • src/cmd/vet/atomic.go
  • src/cmd/vet/buildtag.go
  • src/cmd/vet/deadcode.go
  • src/cmd/vet/doc.go
  • src/cmd/vet/main.go
  • src/cmd/vet/method.go
  • src/cmd/vet/print.go
  • src/cmd/vet/rangeloop.go
  • src/cmd/vet/structtag.go
  • src/cmd/vet/taglit.go
  • src/cmd/vet/test_asm.go
  • src/cmd/vet/test_asm1.s
  • src/cmd/vet/test_asm2.s
  • src/cmd/vet/test_asm3.s
  • src/cmd/vet/test_assign.go
  • src/cmd/vet/test_atomic.go
  • src/cmd/vet/test_buildtag.go
  • src/cmd/vet/test_buildtag_bad.go
  • src/cmd/vet/test_deadcode.go
  • src/cmd/vet/test_method.go
  • src/cmd/vet/test_print.go
  • src/cmd/vet/test_rangeloop.go
  • src/cmd/vet/test_structtag.go
  • src/cmd/vet/test_taglit.go
  • src/cmd/vet/types.go
  • src/cmd/vet/typestub.go

これらのファイルはすべて deleted file mode となっており、合計で5753行が削除されています。

コアとなるコードの解説

このコミットには、Goのメインリポジトリにおける「コアとなるコードの変更」は含まれていません。代わりに、vet ツール全体がメインリポジトリから切り離され、go.tools サブリポジトリへと移管されたため、メインリポジトリからは関連するファイルがすべて削除されています。

この削除は、vet ツールの機能がGo言語のコア部分から分離されたことを意味します。これにより、Go言語のコア開発チームは言語とコンパイラの開発に集中でき、vet のようなツールはより専門的なチームやコミュニティによって独立して進化できるようになります。

関連リンク

参考にした情報源リンク