[インデックス 11456] ファイルの概要
このコミットは、Go言語のツールチェインからgoinstall
コマンドとその関連ファイルを完全に削除するものです。これは、より新しく、より機能的なgo get
コマンドがgoinstall
の役割を完全に代替できるようになったためです。
コミット
commit 1e5b7e706e4cefea8d6fbc1b697119600ea96daf
Author: Gustavo Niemeyer <gustavo@niemeyer.net>
Date: Sun Jan 29 17:22:20 2012 -0200
cmd/goinstall: remove now that 'go get' works
The changes to builder were not tested.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5572083
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1e5b7e706e4cefea8d6fbc1b697119600ea96daf
元コミット内容
cmd/goinstall: remove now that 'go get' works
このコミットは、go get
コマンドが正常に機能するようになったため、goinstall
コマンドを削除するものです。
変更の背景
Go言語の初期のパッケージ管理は、現在とは異なる進化を遂げてきました。goinstall
は、Go言語の初期に存在したパッケージのダウンロードとインストールを行うための実験的なツールでした。これは、外部のGoパッケージをプロジェクトに取り込むための最初の試みの一つです。
しかし、goinstall
にはいくつかの制限がありました。例えば、特定のバージョン管理システム(VCS)に依存し、その設定が複雑であったり、依存関係の解決が限定的であったりする点が挙げられます。
その後、Go 1のリリースに向けて、より堅牢で使いやすいパッケージ管理ツールとしてgo get
が開発されました。go get
は、goinstall
の機能を包含しつつ、より広範なVCSのサポート、よりシンプルなコマンドラインインターフェース、そしてGoモジュールシステム(当時はまだ存在しませんでしたが、その後の進化の基礎となる考え方)への道を開くものでした。
このコミットは、go get
が十分に成熟し、goinstall
の役割を完全に代替できるようになったことを示しています。これにより、Goのツールチェインが簡素化され、開発者は単一のコマンド(go get
)で外部パッケージの取得とインストールを行えるようになりました。
前提知識の解説
Go言語のパッケージ管理の歴史
Go言語のパッケージ管理は、その歴史の中でいくつかの段階を経て進化してきました。
-
初期の
goinstall
:- Go言語の初期に導入された実験的なツールで、外部パッケージのダウンロードとインストールを目的としていました。
$GOROOT/goinstall.log
にインストールされたパッケージのリストを記録し、-a
フラグで一括再インストールする機能などがありました。- 特定のVCS(Mercurial, Git, Subversion, Bazaar)を直接サポートし、
bitbucket.org
,github.com
,code.google.com
,launchpad.net
などの主要なコードホスティングサイトからのダウンロードに対応していました。 $GOPATH
環境変数の概念を導入し、Goのソースコード、パッケージオブジェクト、実行可能ファイルをGoツリーの外部で管理する仕組みを提供しました。
-
go get
の登場とgoinstall
の置き換え:- Go 1のリリースに向けて、
goinstall
の機能をより洗練させ、標準ツールとして統合されたのがgo get
です。 go get
は、goinstall
が提供していた外部パッケージのダウンロード、依存関係の解決、ビルド、インストールといった一連のプロセスを、より効率的かつ統一的に行えるように設計されました。go get
の導入により、goinstall
は冗長となり、このコミットで削除されることになりました。
- Go 1のリリースに向けて、
-
Go Modules (Go 1.11以降):
go get
は$GOPATH
ベースのパッケージ管理の主要ツールでしたが、Go 1.11でGo Modulesが導入され、Goのパッケージ管理はさらに大きく進化しました。- Go Modulesは、依存関係のバージョン管理、再現可能なビルド、ベンダーリング(依存パッケージのローカルコピー)などをサポートし、より現代的なパッケージ管理の課題に対応しています。
- 現在でも
go get
コマンドは存在しますが、その動作はGo Modulesのコンテキストで解釈され、モジュールの追加、更新、削除などに利用されます。
$GOPATH
環境変数
$GOPATH
は、Go言語のワークスペースを定義するための重要な環境変数です。Go 1.11でGo Modulesが導入されるまでは、Goプロジェクトの構造とパッケージの解決に不可欠な役割を果たしていました。
$GOPATH
は、Goのソースコード、コンパイルされたパッケージ(.a
ファイル)、および実行可能バイナリが配置されるディレクトリのリスト(コロン区切り)を指定します。典型的な$GOPATH
のディレクトリ構造は以下のようになります。
$GOPATH/
├── src/ # ソースコード
│ └── github.com/
│ └── user/
│ └── project/
│ └── .goファイル
├── pkg/ # コンパイル済みパッケージ (.a ファイル)
│ └── $GOOS_$GOARCH/
│ └── github.com/
│ └── user/
│ └── project.a
└── bin/ # 実行可能バイナリ
└── project
goinstall
や初期のgo get
は、この$GOPATH
の規則に従ってパッケージをダウンロードし、ビルドし、インストールしていました。
技術的詳細
このコミットは、goinstall
コマンドの完全な削除を目的としており、その影響はGoツールチェインのビルドシステムとソースコードに及びます。
削除されたファイル群の役割
削除されたファイルは、goinstall
コマンドの機能を実現するために不可欠なものでした。
src/cmd/goinstall/Makefile
:goinstall
コマンド自体のビルド方法を定義するMakefile。このファイルが削除されることで、goinstall
はGoツールチェインのビルドプロセスから除外されます。src/cmd/goinstall/doc.go
:goinstall
コマンドのドキュメント。コマンドの目的、使用方法、フラグ、リモートリポジトリの認識方法、$GOPATH
の概念などが詳細に記述されていました。このドキュメントの削除は、goinstall
がもはやGoの公式ツールではないことを意味します。src/cmd/goinstall/download.go
:goinstall
の主要な機能である、リモートリポジトリからのパッケージダウンロードロジックを実装していました。vcs
構造体とvcsMap
は、Mercurial (hg
), Git (git
), Subversion (svn
), Bazaar (bzr
)といった様々なバージョン管理システムを抽象化し、それぞれのコマンド(clone
,update
,pull
など)を定義していました。RemoteRepo
インターフェースとhost
構造体は、github.com
,bitbucket.org
,code.google.com
,launchpad.net
などの特定のコードホスティングサイトからのパッケージの検出と処理を可能にしていました。maybeReportToDashboard
関数は、godashboard.appspot.com
にパッケージのインストール情報を報告する機能を持っていました。これは、Goパッケージの人気度を追跡するための初期の試みでした。selectTag
関数は、Goのバージョン(例:release.rN
,weekly.YYYY-MM-DD
)に基づいて、リポジトリ内の適切なタグ(例:go.rN
,go.weekly.YYYY-MM-DD
)を選択するロジックを含んでいました。これにより、特定のGoバージョンに対応するパッケージのコードを取得することが可能でした。
src/cmd/goinstall/download_test.go
:download.go
で実装されたダウンロード機能の単体テスト。特に、様々なコードホスティングサイトからのリポジトリ検出ロジックを検証していました。src/cmd/goinstall/main.go
:goinstall
コマンドのエントリポイント。コマンドライン引数のパース、パッケージの依存関係解決、ダウンロード、ビルド、インストールといった一連のフローを制御していました。install
関数は、パッケージの依存関係を再帰的に解決し、必要に応じてダウンロードとインストールを実行していました。readPackageList
およびlogPackage
関数は、goinstall.log
ファイルからのインストール済みパッケージリストの読み込みと、新しいパッケージのログ記録を担当していました。gofix
の実行ロジックも含まれており、ビルド失敗時にコードを自動修正する試みが行われていました。
src/cmd/goinstall/make.go
:goinstall
がパッケージをビルドするために使用するMakefileを動的に生成するロジックを実装していました。Goのビルドシステムがまだ現在のように統合されていなかった時期の名残です。src/cmd/goinstall/tag_test.go
:download.go
内のselectTag
関数の単体テスト。Goのバージョンとリポジトリタグのマッチングロジックを検証していました。
Makefileの変更
src/cmd/Makefile
とsrc/pkg/Makefile
からのgoinstall
への参照の削除は、Goツールチェインのビルドプロセスからgoinstall
が完全に切り離されたことを意味します。これにより、Goのビルド時にgoinstall
がコンパイルされなくなり、配布されるGoバイナリパッケージにも含まれなくなります。
コアとなるコードの変更箇所
このコミットは、既存のコードの削除のみで構成されており、新しいコードの追加はありません。
-
src/cmd/Makefile
の変更:--- a/src/cmd/Makefile +++ b/src/cmd/Makefile @@ -40,7 +40,6 @@ CLEANDIRS=\ godoc\ fix\ gofmt\ - goinstall\ gotest\ vet\ yacc\
CLEANDIRS
リストからgoinstall
が削除され、ビルド時のクリーンアップ対象から外されました。 -
src/cmd/goinstall/
ディレクトリ以下の全ファイルの削除:src/cmd/goinstall/Makefile
src/cmd/goinstall/doc.go
src/cmd/goinstall/download.go
src/cmd/goinstall/download_test.go
src/cmd/goinstall/main.go
src/cmd/goinstall/make.go
src/cmd/goinstall/tag_test.go
これらのファイルはすべて削除され、goinstall
コマンドの実装が完全にGoのソースツリーから取り除かれました。 -
src/pkg/Makefile
の変更:--- a/src/pkg/Makefile +++ b/src/pkg/Makefile @@ -158,7 +158,6 @@ DIRS=\ ../cmd/godoc\ ../cmd/fix\ ../cmd/gofmt\ - ../cmd/goinstall\ ../cmd/gotest\ ../cmd/vet\ ../cmd/yacc\
DIRS
リストから../cmd/goinstall
が削除され、パッケージビルドの対象から外されました。
コアとなるコードの解説
このコミットの「コアとなるコードの変更」は、実質的にgoinstall
コマンドに関連するすべてのファイルの削除です。これは、goinstall
がGoツールチェインの歴史的遺物となり、その役割がgo get
に完全に引き継がれたことを明確に示しています。
削除されたファイル群は、Goの初期のパッケージ管理の試行錯誤の歴史を物語っています。特にdownload.go
は、Goがどのようにして様々なVCSと連携し、外部パッケージを取得しようとしていたかを示す貴重な例です。main.go
は、依存関係の解決、ビルド、インストールという一連のプロセスをどのようにオーケストレーションしていたかを示しています。
これらのファイルの削除は、Go言語のパッケージ管理がgo get
へと一本化され、よりシンプルで統一された開発体験を提供するための重要なステップでした。
関連リンク
- Go言語の公式ドキュメント: https://go.dev/
go get
コマンドのドキュメント: https://go.dev/cmd/go/#hdr-Download_and_install_packages_and_dependencies- Go Modulesのドキュメント: https://go.dev/blog/using-go-modules
参考にした情報源リンク
- Go言語のソースコードリポジトリ (GitHub): https://github.com/golang/go
- GoのIssue Tracker (Goinstallの議論など): https://go.dev/issue
- GoのChange List (CL 5572083): https://golang.org/cl/5572083 (コミットメッセージに記載されているリンク)
- Go Dashboard (godashboard.appspot.com):
goinstall
がパッケージ情報を報告していたダッシュボード。現在はGoの公式パッケージサイトpkg.go.dev
に統合されています。