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

[インデックス 12321] ファイルの概要

このコミットは、Go言語のビルドシステムにおける GOPATH 環境変数に関するドキュメントを追加・改善するものです。具体的には、src/cmd/go/help.goGOPATH の簡単な説明を追加し、src/pkg/go/build/build.goGOPATH の詳細な構造と動作に関する包括的なドキュメントを追記しています。

コミット

commit 9316070419ac6fd732d4d163c11585e90dbc6099
Author: Russ Cox <rsc@golang.org>
Date:   Thu Mar 1 18:26:53 2012 -0500

    go/build: document GOPATH
    
    Fixes #2332.
    
    R=golang-dev, remyoudompheng, gri, r, r
    CC=golang-dev
    https://golang.org/cl/5710055

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/9316070419ac6fd732d4d163c11585e90dbc6099

元コミット内容

    go/build: document GOPATH
    
    Fixes #2332.
    
    R=golang-dev, remyoudompheng, gri, r, r
    CC=golang-dev
    https://golang.org/cl/5710055

変更の背景

このコミットの背景には、Go言語の初期段階における GOPATH の概念の確立と、それに関するドキュメントの不足がありました。コミットメッセージにある Fixes #2332 は、GoのIssueトラッカーにおける「Issue 2332: go/build: document GOPATH」を指しています。このIssueは、GOPATH の重要性にもかかわらず、その定義、構造、および使用方法に関する公式なドキュメントが不足していることを指摘していました。

Go言語は、その設計思想としてシンプルさと効率性を重視しており、プロジェクトの依存関係管理やビルドプロセスを簡素化するために GOPATH という独自のワークスペース概念を導入しました。しかし、この新しい概念は、特に他のプログラミング言語からの移行者にとって理解しにくい側面がありました。そのため、GOPATH がどのように機能し、Goプロジェクトがどのように配置されるべきかを明確に説明するドキュメントが強く求められていました。

このコミットは、その要求に応える形で、GOPATH の役割、ディレクトリ構造、およびGoツールがどのように GOPATH を利用してソースコード、コンパイル済みパッケージ、および実行可能ファイルを管理するかを詳細に記述することで、ユーザーの理解を深め、Go開発の障壁を下げることを目的としています。

前提知識の解説

このコミットを理解するためには、以下のGo言語の基本的な概念と用語を理解しておく必要があります。

  • Go言語のワークスペース (Workspace): Go言語では、プロジェクトは通常、単一のワークスペース内で管理されます。このワークスペースは、GOPATH 環境変数によって指定されるディレクトリ構造に従います。
  • GOPATH 環境変数: GOPATH は、Goのソースコード、コンパイル済みパッケージ、および実行可能ファイルが配置されるルートディレクトリを指定する環境変数です。複数のパスをコロン(Unix系)またはセミコロン(Windows)で区切って指定できます。
  • パッケージ (Package): Go言語のコードはパッケージにまとめられます。パッケージは、関連する機能の集合であり、再利用可能なコードの単位です。
  • インポートパス (Import Path): Goのソースファイル内で他のパッケージを使用する場合、そのパッケージのインポートパスを指定します。インポートパスは、GOPATH 内の src ディレクトリからの相対パスとして解決されます。
  • go build コマンド: Goのソースコードをコンパイルして実行可能ファイルを生成するコマンドです。
  • go install コマンド: Goのソースコードをコンパイルし、その結果(実行可能ファイルまたはパッケージアーカイブ)を GOPATH 内の適切なディレクトリにインストールするコマンドです。
  • src ディレクトリ: GOPATH の各エントリの直下に存在するディレクトリで、Goのソースコードが配置されます。
  • pkg ディレクトリ: GOPATH の各エントリの直下に存在するディレクトリで、コンパイル済みのパッケージアーカイブ(.a ファイルなど)が配置されます。オペレーティングシステムとアーキテクチャごとにサブディレクトリが作成されます(例: pkg/linux_amd64)。
  • bin ディレクトリ: GOPATH の各エントリの直下に存在するディレクトリで、go install コマンドによって生成された実行可能ファイルが配置されます。

技術的詳細

このコミットは、Go言語のビルドシステムの中核をなす go/build パッケージと、ユーザーがGoツールを操作する際に参照する src/cmd/go/help.go の両方に変更を加えています。

go/build パッケージは、Goのソースコードの解析、パッケージの解決、およびビルド制約の適用を担当します。このパッケージは、Goツールチェーンの他の部分(go build, go install, go get など)によって内部的に使用され、GOPATH の規則に従ってソースファイルを検索し、依存関係を解決します。

コミットによって src/pkg/go/build/build.go に追加されたドキュメントは、GOPATH の以下の側面を詳細に説明しています。

  1. GOPATH の定義: GOPATH がGoソースコードを含むディレクトリツリーのリストであること、および標準のGoツリーで見つからないインポートを解決するために参照されることを明記しています。
  2. 環境変数の解釈: GOPATH 環境変数が、オペレーティングシステム(Unix、Windows、Plan 9)に応じてどのようにパスリストとして解釈されるかを説明しています。
  3. GOPATH ディレクトリの構造: GOPATH 内の各ディレクトリが持つべき規定の構造(src/, pkg/, bin/)を詳細に記述しています。
    • src/: ソースコードを保持し、その下のパスがインポートパスや実行可能ファイル名を決定すること。
    • pkg/: インストールされたパッケージオブジェクトを保持し、GOOS_GOARCH のサブディレクトリを持つこと。
    • bin/: コンパイルされたコマンドを保持し、ソースディレクトリの最終要素に基づいて命名されること。これにより、DIR/binPATH に追加することでコマンドにアクセスできる利便性を説明しています。
  4. 具体的なディレクトリレイアウトの例: GOPATH=/home/user/gocode の具体的な例を挙げて、src/, bin/, pkg/ の下にどのようにファイルが配置されるかを視覚的に示しています。これにより、ユーザーは GOPATH の構造をより具体的に理解できます。

一方、src/cmd/go/help.go への変更は、go help gopath コマンドの出力に、GOPATH がインポートステートメントの解決に使用されること、および go/build パッケージによって実装・ドキュメント化されていることを簡潔に追記しています。これは、ユーザーがコマンドラインから GOPATH についての基本的な情報を素早く得られるようにするための改善です。

これらの変更は、Go言語のビルドシステムにおける GOPATH の役割を明確にし、開発者がGoプロジェクトを適切に設定し、管理するための重要なガイドラインを提供します。特に、go/build パッケージ内のドキュメントは、Goツールが内部的に GOPATH をどのように扱っているかについての公式な説明となり、Go言語の設計思想と実装の詳細を理解する上で不可欠な情報を提供します。

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

このコミットによる主要なコード変更は以下の2つのファイルにあります。

  1. src/cmd/go/help.go: helpGopath コマンドの Long フィールドに、GOPATH の簡単な説明が追加されています。

    --- a/src/cmd/go/help.go
    +++ b/src/cmd/go/help.go
    @@ -138,6 +138,9 @@ var helpGopath = &Command{
     	UsageLine: "gopath",
     	Short:     "GOPATH environment variable",
     	Long: `
    +The Go path is used to resolve import statements.
    +It is implemented by and documented in the go/build package.
    +
     The GOPATH environment variable lists places to look for Go code.
     On Unix, the value is a colon-separated string.
     On Windows, the value is a semicolon-separated string.
    
  2. src/pkg/go/build/build.go: GOPATH に関する詳細なドキュメントが追加されています。これは、以前の // TODO: Document GOPATH. のコメントを置き換えるものです。

    --- a/src/pkg/go/build/build.go
    +++ b/src/pkg/go/build/build.go
    @@ -6,7 +6,54 @@
     //
     // Go Path
     //
    -// TODO: Document GOPATH.
    +// The Go path is a list of directory trees containing Go source code.
    +// It is consulted to resolve imports that cannot be found in the standard
    +// Go tree.  The default path is the value of the GOPATH environment
    +// variable, interpreted as a path list appropriate to the operating system
    +// (on Unix, the variable is a colon-separated string;
    +// on Windows, a semicolon-separated string;
    +// on Plan 9, a list).
    +//
    +// Each directory listed in the Go path must have a prescribed structure:
    +//
    +// The src/ directory holds source code.  The path below 'src' determines
    +// the import path or executable name.
    +//
    +// The pkg/ directory holds installed package objects.
    +// As in the Go tree, each target operating system and
    +// architecture pair has its own subdirectory of pkg
    +// (pkg/GOOS_GOARCH).
    +//
    +// If DIR is a directory listed in the Go path, a package with
    +// source in DIR/src/foo/bar can be imported as "foo/bar" and
    +// has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a"
    +// (or, for gccgo, "DIR/pkg/gccgo/foo/libbar.a").
    +//
    +// The bin/ directory holds compiled commands.
    +// Each command is named for its source directory, but only
    +// using the final element, not the entire path.  That is, the
    +// command with source in DIR/src/foo/quux is installed into
    +// DIR/bin/quux, not DIR/bin/foo/quux.  The foo/ is stripped
    +// so that you can add DIR/bin to your PATH to get at the
    +// installed commands.
    +//
    +// Here's an example directory layout:
    +//
    +//	GOPATH=/home/user/gocode
    +//
    +//	/home/user/gocode/
    +//	    src/
    +//	        foo/
    +//	            bar/               (go code in package bar)
    +//	                x.go
    +//	            quux/              (go code in package main)
    +//	                y.go
    +//	    bin/
    +//	        quux                   (installed command)
    +//	    pkg/
    +//	        linux_amd64/
    +//	            foo/
    +//	                bar.a          (installed package object)
     //
     // Build Constraints
     //
    

コアとなるコードの解説

このコミットの「コアとなるコード」は、Goのソースコードそのものというよりも、Goのビルドシステムの中核をなす GOPATH の概念を説明するドキュメントの追加です。

src/pkg/go/build/build.go に追加されたコメントブロックは、Go言語における GOPATH の「公式な仕様書」としての役割を果たします。このドキュメントは、GOPATH が単なる環境変数ではなく、Goプロジェクトの構造とビルドプロセス全体を規定する重要な要素であることを明確にしています。

具体的には、以下の点が重要です。

  • GOPATH の目的: 標準のGoツリーにないインポートを解決するためのディレクトリツリーのリストであると定義されています。これは、サードパーティライブラリやユーザー自身のプロジェクトコードをGoツールがどのように見つけるかを説明しています。
  • 構造の厳格性: GOPATH 内の各ディレクトリが src/, pkg/, bin/ という特定の構造を持つ必要があることを強調しています。これは、Goツールがこれらのディレクトリを期待し、それに基づいて動作するため、この構造に従うことがGo開発の基本であることを示しています。
  • src/ の役割: src/ の下のパスがインポートパスや実行可能ファイル名を決定するという説明は、Goのパッケージ管理とモジュールシステム(当時はまだGo Modulesは存在しないが、その前身となる概念)の基盤を形成しています。例えば、DIR/src/foo/bar にあるコードは foo/bar としてインポートされるという規則は、Goのコードベースを整理し、再利用可能にする上で不可欠です。
  • pkg/bin/ の役割: コンパイル済み成果物の配置場所を明確にすることで、Goツールがどのようにビルド成果物を管理し、ユーザーがそれらにアクセスできるかを説明しています。特に bin/ ディレクトリから foo/ が取り除かれるという説明は、GOPATH/binPATH に追加するだけでコマンドを実行できるというGoの利便性を裏付けています。
  • 具体例の提示: 実際のディレクトリレイアウトの例 (GOPATH=/home/user/gocode) は、抽象的な概念を具体的なファイルシステム上の配置に結びつけ、ユーザーが自身の環境で GOPATH を設定する際の強力な手助けとなります。

src/cmd/go/help.go への変更は、ユーザーが go help gopath を実行した際に、この詳細なドキュメントの存在を知らせる「入り口」としての役割を果たします。これにより、ユーザーは GOPATH の基本的な情報を素早く得つつ、必要であれば go/build パッケージのドキュメントを参照してより深い理解を得ることができます。

これらのドキュメントの追加は、Go言語の初期段階において、そのエコシステムを健全に成長させるために不可欠な情報基盤を構築するものでした。開発者が GOPATH の概念を正しく理解し、Goプロジェクトを効率的に管理するための基盤を提供した点で、非常に重要な変更と言えます。

関連リンク

参考にした情報源リンク