[インデックス 12327] ファイルの概要
このコミットは、Go言語の公式ドキュメントの一部である doc/code.html ファイルを大幅に改訂し、go コマンドの利用方法とGoプロジェクトの構造に関する解説を拡充したものです。特に、GOPATH の概念、ワークスペースの組織化、パッケージのビルドとインストール、テストの実行、そしてリモートパッケージの取得方法について、より詳細な説明と具体的なコード例が追加されています。
コミット
commit 718de6f4c64a439a867dd0b8aad05f7da630bf76
Author: Andrew Gerrand <adg@golang.org>
Date: Fri Mar 2 15:35:36 2012 +1100
doc: expand code.html to discuss the go tool in more depth
R=golang-dev, balasanjay, r
CC=golang-dev
https://golang.org/cl/5640045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/718de6f4c64a439a867dd0b8aad05f7da630bf76
元コミット内容
doc: expand code.html to discuss the go tool in more depth
このコミットメッセージは、code.html ドキュメントを拡張し、go ツールについてより深く議論することを目的としていることを明確に示しています。
変更の背景
このコミットが行われた2012年当時、Go言語はまだ比較的新しい言語であり、その開発ツールである go コマンドの機能と利用方法に関する公式ドキュメントの充実が求められていました。特に、Goのユニークなコード組織化の概念である GOPATH や、パッケージの依存関係管理、ビルド、インストール、テストといった開発ワークフローの核となる go コマンドの役割について、ユーザーがより深く理解できるよう、詳細な解説が必要とされていました。
以前の doc/code.html は、新しいパッケージの作成やテストの基本的な説明に留まっており、go ツールの包括的な機能や、Goプロジェクトを効率的に管理するためのベストプラクティスについては十分に触れられていませんでした。このコミットは、そのギャップを埋め、Go開発者がよりスムーズに開発を進められるようにするための重要なドキュメント改善の一環として実施されました。
前提知識の解説
Go言語のパッケージとモジュール(当時のGOPATH中心のモデル)
Go言語では、コードは「パッケージ」という単位で組織されます。関連する機能は一つのパッケージにまとめられ、他のパッケージからインポートして利用されます。当時のGoでは、パッケージの管理とビルドは主に GOPATH という環境変数によって制御されていました。
GOPATH: Goのソースコード、コンパイル済みパッケージ、実行可能バイナリが配置されるワークスペースのルートディレクトリを指定する環境変数です。複数のパスを指定することも可能でした。- ワークスペースの構造:
GOPATHで指定された各ワークスペースは、慣例として以下の3つのサブディレクトリを持ちます。src: Goのソースファイル(.go、.c、.h、.sなど)が配置されます。パッケージのインポートパスは、srcディレクトリ以下のパスに対応します。pkg:go installコマンドによってコンパイルされたパッケージオブジェクト(.aファイルなど)が、OSとアーキテクチャごとのサブディレクトリに配置されます。bin:go installコマンドによってコンパイルされた実行可能コマンド(package mainのプログラム)が配置されます。
- インポートパス: Goのパッケージは、そのソースコードが
GOPATH/src以下に配置されているパスを基にしたインポートパスで参照されます。例えば、$GOPATH/src/example.com/myproject/mypackageにあるパッケージは、"example.com/myproject/mypackage"としてインポートされます。特に、バージョン管理システムのリポジトリURLをインポートパスに含めることで、go getコマンドによる自動取得が可能になります。
go コマンド
go コマンドは、Go言語の開発において中心的な役割を果たす統合ツールです。当時の主なサブコマンドには以下のようなものがありました。
go install: 指定されたパッケージとその依存関係をビルドし、コンパイルされたパッケージオブジェクトをpkgディレクトリに、実行可能バイナリをbinディレクトリにインストールします。go build: 指定されたパッケージをビルドしますが、結果をpkgやbinディレクトリにはインストールせず、一時ディレクトリに生成します。実行可能コマンドの場合はカレントディレクトリにバイナリを生成します。主にコンパイルが通るかどうかの確認に使われます。go test: 指定されたパッケージのテストを実行します。_test.goで終わるファイル内のTestXXX関数を自動的に探し、実行します。go get: リモートリポジトリからGoパッケージのソースコードをフェッチし、ビルドしてインストールします。インポートパスがリポジトリURLの形式に従っている場合に機能します。
package main と実行可能コマンド
Goのソースファイルが package main と宣言されている場合、それは実行可能なプログラムのエントリポイントとなります。main パッケージには main 関数が含まれ、プログラムの実行開始点となります。go install コマンドで main パッケージをビルドすると、GOPATH/bin ディレクトリに実行可能バイナリが生成されます。
技術的詳細
このコミットは、doc/code.html の内容を、Go言語のコード組織化と go コマンドの利用に関する包括的なガイドへと進化させています。具体的な変更点は以下の通りです。
-
GOPATHとワークスペースの概念の明確化:GOPATHがGoパッケージの検索とインストール場所をgoコマンドに伝えるための重要な環境変数であることが強調されています。GOPATHが複数のパスをコロン(Unix系)またはセミコロン(Windows)で区切って指定できること、そしてそれぞれのパスが「ワークスペース」を構成することが説明されています。- ワークスペースが
src、pkg、binの3つの標準的なサブディレクトリを持つことが明記され、それぞれの役割が詳細に解説されています。 - 具体的な
GOPATHの設定例(export GOPATH=$HOME/mygo)と、PATH環境変数へのbinディレクトリの追加が示されています。
-
インポートパスのベストプラクティス:
- 標準ライブラリ以外の自身のプロジェクトでは、将来的な衝突を避けるためにユニークなベースインポートパスを選択することの重要性が説かれています。
- バージョン管理リポジトリのURL(例:
example.com/foo/barやcode.google.com/p/example/foo/bar)をインポートパスとして使用することが推奨されており、これによりgoコマンドがソースコードを自動的にチェックアウト・ビルドできることが説明されています。
-
パッケージのビルドとインストール (
go install):go installコマンドがパッケージとその依存関係をビルドし、インストールする中心的なコマンドであることが強調されています。- 「パッケージをインストールする」とは、ワークスペースの
pkgまたはbinサブディレクトリにパッケージオブジェクトまたは実行可能コマンドを書き込むことであると定義されています。 example/newmathパッケージの作成とgo install example/newmathによるビルド・インストール、およびその結果のワークスペース構造が具体例として示されています。- カレントディレクトリにいる場合はインポートパスの指定を省略できるという便利な機能も紹介されています。
-
コマンドのビルドと実行 (
package main):goコマンドがpackage mainに属するコードを実行可能コマンドとして扱い、GOPATH/binにインストールすることが説明されています。example/helloコマンドの作成と、newmathパッケージをインポートして利用する例が示されています。go install example/helloによるビルドと、$GOPATH/bin/helloまたはhello(PATHが設定されている場合) による実行方法が解説されています。
-
テスト (
go test) の詳細化:go testコマンドとtestingパッケージからなるGoの軽量なテストフレームワークが紹介されています。_test.goで終わるファイルにTestXXXというシグネチャを持つ関数を記述することでテストを作成する方法が説明されています。example/newmathパッケージに対するsqrt_test.goの具体的なテストコードと、go test example/newmathによるテスト実行例が示されています。
-
リモートパッケージ (
go get):- インポートパスがGitやMercurialなどのバージョン管理システムからソースコードを取得する方法を記述できることが説明されています。
go getコマンドがリモートリポジトリからパッケージを自動的にフェッチ、ビルド、インストールする機能が紹介されています。code.google.com/p/go.example/helloの例を用いて、go getがどのように動作し、依存するパッケージも取得するかが示されています。go getがGOPATHで指定された最初のワークスペースにパッケージを配置すること、および既にパッケージが存在する場合はリモートフェッチをスキップしてgo installと同じ動作をすることが説明されています。- この慣習がGoパッケージを他の開発者が利用可能にする最も簡単な方法であることが強調されています。
-
その他の変更:
go buildコマンドがinstallとは異なり、一時ディレクトリでビルドを行い、pkgやbinにインストールしないことが追記されています。Effective GoやA Tour of Go、その他のドキュメントページへの「Further reading」セクションが追加され、学習リソースが提供されています。- 以前のドキュメントにあった「Community resources」「An example package with tests」「Architecture- and operating system-specific code」などのセクションは削除または統合され、より
goコマンドとワークフローに焦点を当てた構成になっています。
全体として、このコミットは doc/code.html を、Go言語の基本的な開発ワークフローと go コマンドの利用方法を学ぶための、より実践的で包括的な入門ガイドへと変貌させています。
コアとなるコードの変更箇所
変更は doc/code.html ファイル全体にわたる大規模な改訂です。具体的には、HTMLのセクション構造が変更され、既存のコンテンツが削除・修正され、新しいコンテンツが大量に追加されています。
変更ファイル: doc/code.html
主な変更内容の抜粋:
- 削除されたセクションの例:
id="Community_resources"id="New_package"(一部が新しいセクションに統合)id="Building_programs"(一部が新しいセクションに統合)id="Testing"(大幅に書き換えられ、新しいセクションに統合)id="pkg_example"id="arch_os_specific"
- 追加されたセクションの例:
id="GOPATH"(Code organization のサブセクションとして)id="Building"(Building and installing のサブセクションとして)id="remote"(Remote packages)id="more"(Further reading)
具体的なコード差分(概念的なハイライト):
GOPATHの説明が大幅に拡張され、src,pkg,binディレクトリの役割が詳細に記述されています。go installとgo getのコマンドライン例と、それらがファイルシステムに与える影響(pkgやbinディレクトリへの出力)が具体的に示されています。example/newmathパッケージとexample/helloコマンドの作成、ビルド、実行、テストのチュートリアル形式の例が追加されています。- リモートリポジトリからのパッケージ取得 (
go get) の重要性と、インポートパスの慣習が強調されています。
コアとなるコードの解説
このコミットにおける「コアとなるコード」とは、Go言語のソースコードそのものではなく、Go言語の利用方法を説明するドキュメントのHTMLコードです。
変更の核心は、doc/code.html のHTML構造とコンテンツの再構築にあります。
-
HTML構造の変更:
<h2>タグで定義される主要なセクションが再編成され、GOPATH、コード組織、ビルド、テスト、リモートパッケージといった概念がより論理的な流れで説明されるようになりました。- 各セクション内では、
<h3>や<p>、<pre>(コードブロック) を用いて、詳細な説明、コマンドの実行例、期待される出力、そしてファイルシステムの構造が視覚的に分かりやすく提示されています。
-
コンテンツの拡充と具体例の追加:
- 特に
GOPATHの説明では、環境変数の設定方法、ワークスペースのディレクトリ構造 (src,pkg,bin)、そしてそれらがgoコマンドとどのように連携するかが、具体的なパスの例を交えて詳細に解説されています。 go installやgo test、go getといったコマンドの利用例では、架空のexample/newmathパッケージとexample/helloコマンドを用いて、ソースコードの作成からビルド、実行、テスト、そしてリモートからの取得までの一連のワークフローがステップバイステップで示されています。これにより、読者は実際に手を動かしながらGoの開発プロセスを学ぶことができます。- コードブロック (
<pre>) 内のシェルコマンドと出力は、実際のターミナルでの体験を模倣しており、読者がコマンドの動作を直感的に理解できるようになっています。
- 特に
このドキュメントの変更は、Go言語の学習曲線において非常に重要な役割を果たしました。go コマンドと GOPATH の概念は、Go開発の初期段階で多くのユーザーが直面する課題の一つであり、この詳細な解説は、それらの理解を深め、Goプロジェクトの管理を容易にする上で不可欠な情報を提供しました。
関連リンク
- Go言語公式ドキュメント: https://go.dev/doc/
goコマンドのドキュメント: https://go.dev/cmd/go/testingパッケージのドキュメント: https://go.dev/pkg/testing/- Effective Go: https://go.dev/doc/effective_go
- A Tour of Go: https://tour.golang.org/
参考にした情報源リンク
- GitHubコミットページ: https://github.com/golang/go/commit/718de6f4c64a439a867dd0b8aad05f7da630bf76
- Go Code Review (Gerrit): https://golang.org/cl/5640045 (コミットメッセージに記載されているGerritの変更リストへのリンク)
- Go言語の歴史とGOPATHの変遷に関する一般的な知識 (2012年当時のGoの状況を理解するために参照)