[インデックス 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の状況を理解するために参照)