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

[インデックス 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言語のパッケージ管理は、その歴史の中でいくつかの段階を経て進化してきました。

  1. 初期のgoinstall:

    • Go言語の初期に導入された実験的なツールで、外部パッケージのダウンロードとインストールを目的としていました。
    • $GOROOT/goinstall.logにインストールされたパッケージのリストを記録し、-aフラグで一括再インストールする機能などがありました。
    • 特定のVCS(Mercurial, Git, Subversion, Bazaar)を直接サポートし、bitbucket.org, github.com, code.google.com, launchpad.netなどの主要なコードホスティングサイトからのダウンロードに対応していました。
    • $GOPATH環境変数の概念を導入し、Goのソースコード、パッケージオブジェクト、実行可能ファイルをGoツリーの外部で管理する仕組みを提供しました。
  2. go getの登場とgoinstallの置き換え:

    • Go 1のリリースに向けて、goinstallの機能をより洗練させ、標準ツールとして統合されたのがgo getです。
    • go getは、goinstallが提供していた外部パッケージのダウンロード、依存関係の解決、ビルド、インストールといった一連のプロセスを、より効率的かつ統一的に行えるように設計されました。
    • go getの導入により、goinstallは冗長となり、このコミットで削除されることになりました。
  3. 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/Makefilesrc/pkg/Makefileからのgoinstallへの参照の削除は、Goツールチェインのビルドプロセスからgoinstallが完全に切り離されたことを意味します。これにより、Goのビルド時にgoinstallがコンパイルされなくなり、配布されるGoバイナリパッケージにも含まれなくなります。

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

このコミットは、既存のコードの削除のみで構成されており、新しいコードの追加はありません。

  1. 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が削除され、ビルド時のクリーンアップ対象から外されました。

  2. 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のソースツリーから取り除かれました。

  3. 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言語のソースコードリポジトリ (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に統合されています。