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

[インデックス 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: 指定されたパッケージをビルドしますが、結果を pkgbin ディレクトリにはインストールせず、一時ディレクトリに生成します。実行可能コマンドの場合はカレントディレクトリにバイナリを生成します。主にコンパイルが通るかどうかの確認に使われます。
  • 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 コマンドの利用に関する包括的なガイドへと進化させています。具体的な変更点は以下の通りです。

  1. GOPATH とワークスペースの概念の明確化:

    • GOPATH がGoパッケージの検索とインストール場所を go コマンドに伝えるための重要な環境変数であることが強調されています。
    • GOPATH が複数のパスをコロン(Unix系)またはセミコロン(Windows)で区切って指定できること、そしてそれぞれのパスが「ワークスペース」を構成することが説明されています。
    • ワークスペースが srcpkgbin の3つの標準的なサブディレクトリを持つことが明記され、それぞれの役割が詳細に解説されています。
    • 具体的な GOPATH の設定例(export GOPATH=$HOME/mygo)と、PATH 環境変数への bin ディレクトリの追加が示されています。
  2. インポートパスのベストプラクティス:

    • 標準ライブラリ以外の自身のプロジェクトでは、将来的な衝突を避けるためにユニークなベースインポートパスを選択することの重要性が説かれています。
    • バージョン管理リポジトリのURL(例: example.com/foo/barcode.google.com/p/example/foo/bar)をインポートパスとして使用することが推奨されており、これにより go コマンドがソースコードを自動的にチェックアウト・ビルドできることが説明されています。
  3. パッケージのビルドとインストール (go install):

    • go install コマンドがパッケージとその依存関係をビルドし、インストールする中心的なコマンドであることが強調されています。
    • 「パッケージをインストールする」とは、ワークスペースの pkg または bin サブディレクトリにパッケージオブジェクトまたは実行可能コマンドを書き込むことであると定義されています。
    • example/newmath パッケージの作成と go install example/newmath によるビルド・インストール、およびその結果のワークスペース構造が具体例として示されています。
    • カレントディレクトリにいる場合はインポートパスの指定を省略できるという便利な機能も紹介されています。
  4. コマンドのビルドと実行 (package main):

    • go コマンドが package main に属するコードを実行可能コマンドとして扱い、GOPATH/bin にインストールすることが説明されています。
    • example/hello コマンドの作成と、newmath パッケージをインポートして利用する例が示されています。
    • go install example/hello によるビルドと、$GOPATH/bin/hello または hello (PATHが設定されている場合) による実行方法が解説されています。
  5. テスト (go test) の詳細化:

    • go test コマンドと testing パッケージからなるGoの軽量なテストフレームワークが紹介されています。
    • _test.go で終わるファイルに TestXXX というシグネチャを持つ関数を記述することでテストを作成する方法が説明されています。
    • example/newmath パッケージに対する sqrt_test.go の具体的なテストコードと、go test example/newmath によるテスト実行例が示されています。
  6. リモートパッケージ (go get):

    • インポートパスがGitやMercurialなどのバージョン管理システムからソースコードを取得する方法を記述できることが説明されています。
    • go get コマンドがリモートリポジトリからパッケージを自動的にフェッチ、ビルド、インストールする機能が紹介されています。
    • code.google.com/p/go.example/hello の例を用いて、go get がどのように動作し、依存するパッケージも取得するかが示されています。
    • go getGOPATH で指定された最初のワークスペースにパッケージを配置すること、および既にパッケージが存在する場合はリモートフェッチをスキップして go install と同じ動作をすることが説明されています。
    • この慣習がGoパッケージを他の開発者が利用可能にする最も簡単な方法であることが強調されています。
  7. その他の変更:

    • go build コマンドが install とは異なり、一時ディレクトリでビルドを行い、pkgbin にインストールしないことが追記されています。
    • Effective GoA 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 installgo get のコマンドライン例と、それらがファイルシステムに与える影響(pkgbin ディレクトリへの出力)が具体的に示されています。
  • example/newmath パッケージと example/hello コマンドの作成、ビルド、実行、テストのチュートリアル形式の例が追加されています。
  • リモートリポジトリからのパッケージ取得 (go get) の重要性と、インポートパスの慣習が強調されています。

コアとなるコードの解説

このコミットにおける「コアとなるコード」とは、Go言語のソースコードそのものではなく、Go言語の利用方法を説明するドキュメントのHTMLコードです。

変更の核心は、doc/code.html のHTML構造とコンテンツの再構築にあります。

  1. HTML構造の変更:

    • <h2> タグで定義される主要なセクションが再編成され、GOPATH、コード組織、ビルド、テスト、リモートパッケージといった概念がより論理的な流れで説明されるようになりました。
    • 各セクション内では、<h3><p><pre> (コードブロック) を用いて、詳細な説明、コマンドの実行例、期待される出力、そしてファイルシステムの構造が視覚的に分かりやすく提示されています。
  2. コンテンツの拡充と具体例の追加:

    • 特に GOPATH の説明では、環境変数の設定方法、ワークスペースのディレクトリ構造 (src, pkg, bin)、そしてそれらが go コマンドとどのように連携するかが、具体的なパスの例を交えて詳細に解説されています。
    • go installgo testgo get といったコマンドの利用例では、架空の example/newmath パッケージと example/hello コマンドを用いて、ソースコードの作成からビルド、実行、テスト、そしてリモートからの取得までの一連のワークフローがステップバイステップで示されています。これにより、読者は実際に手を動かしながらGoの開発プロセスを学ぶことができます。
    • コードブロック (<pre>) 内のシェルコマンドと出力は、実際のターミナルでの体験を模倣しており、読者がコマンドの動作を直感的に理解できるようになっています。

このドキュメントの変更は、Go言語の学習曲線において非常に重要な役割を果たしました。go コマンドと GOPATH の概念は、Go開発の初期段階で多くのユーザーが直面する課題の一つであり、この詳細な解説は、それらの理解を深め、Goプロジェクトの管理を容易にする上で不可欠な情報を提供しました。

関連リンク

参考にした情報源リンク