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

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

このコミットは、Go言語の公式ドキュメントに「The go command」という新しい記事(doc/articles/go_command.html)を追加するものです。この新しい記事は、Goコマンドの設計思想、その目的、そして使用方法について解説しています。また、既存のドキュメント一覧ページ(doc/docs.html)にこの新しい記事へのリンクが追加されています。

コミット

  • コミットハッシュ: 73b8ccb0b0cd298da681df17ce1af7ac89c41798
  • Author: Andrew Gerrand adg@golang.org
  • Date: Wed Mar 7 07:40:21 2012 +1100
  • コミットメッセージ:
    doc: add "The go command" article based on Russ' mail
    
    This is a philosophical document. We can soup it up at a later stage,
    but for now it's nice to have a URL to point to that isn't a mailing
    list post.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5676061
    

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

https://github.com/golang/go/commit/73b8ccb0b0cd298da681df17ce1af7ac89c41798

元コミット内容

このコミットは、Go言語の公式ドキュメントに「The go command」という記事を追加するものです。この記事は、Russ Cox氏のメールに基づいたものであり、Goコマンドの哲学的な側面を説明することを目的としています。コミットメッセージには、「これは哲学的なドキュメントである。後で改良することもできるが、今のところはメーリングリストの投稿ではないURLを指し示すことができるのは良いことだ」と記されており、Goコマンドの設計思想を公式に文書化することの重要性が示唆されています。

変更の背景

Go言語は、大規模なソフトウェア開発におけるコンパイル時間の短縮と依存関係管理の簡素化を目指して設計されました。初期のGo開発では、ビルドプロセスにmakemakefilesが使用されていましたが、Goの設計目標の一つに「ソースコード内の情報のみを使用してGoコードをビルドできること」がありました。これは、設定ファイルなしでビルドを可能にすることを目指すものでした。

go commandは、この理想を実現するために開発されました。しかし、その動作原理や背後にある哲学は、当時のユーザーにとって必ずしも明確ではありませんでした。特に、Goが採用する「設定よりも規約(Convention over Configuration)」のアプローチは、他の言語の慣習に慣れた開発者にとっては理解しにくい側面がありました。

このコミットは、Russ Cox氏のメール(おそらくGoコマンドの設計原則について議論されたもの)を基に、Goコマンドの哲学的な側面を公式ドキュメントとして提供することを目的としています。これにより、ユーザーはGoコマンドがなぜそのように設計されているのか、そしてどのように活用すべきかをより深く理解できるようになります。メーリングリストの投稿ではなく、永続的なURLを持つ公式ドキュメントとして提供することで、情報の参照性と信頼性が向上します。

前提知識の解説

このコミットの理解には、以下のGo言語の基本的な概念とツールに関する知識が役立ちます。

  • Go言語: Googleによって開発されたオープンソースのプログラミング言語。シンプルさ、効率性、並行処理のサポートを特徴とします。
  • go command: Go言語の公式ツールチェーンに含まれるコマンドラインツール。Goパッケージのダウンロード、ビルド、インストール、テストなどを自動化します。例えば、go buildgo rungo testgo getgo installなどのサブコマンドがあります。
  • GOPATH: Goのワークスペースのルートディレクトリを指定する環境変数。Goのソースコード、コンパイル済みパッケージ、実行可能ファイルが配置される場所を定義します。Goコマンドは、このGOPATHに基づいてソースコードを検索し、ビルド成果物を配置します。
  • パッケージ (Package): Go言語におけるコードの組織単位。関連する機能や型をまとめたもので、他のパッケージからインポートして利用できます。
  • インポートパス (Import Path): パッケージを一意に識別するための文字列。通常、バージョン管理システムのリポジトリURLに基づいています(例: github.com/user/repo/package)。
  • 設定よりも規約 (Convention over Configuration): ソフトウェア設計のパラダイムの一つで、開発者が設定ファイルで詳細を記述する代わりに、特定の規約に従うことで、ツールが自動的に動作することを可能にするアプローチです。Goコマンドは、この原則を強く採用しており、GOPATHの構造やインポートパスの命名規則などがその例です。
  • go get: リモートリポジトリからGoパッケージのソースコードをダウンロードし、GOPATH内に配置するコマンド。依存関係も自動的に解決します。
  • go install: パッケージをコンパイルし、その結果(実行可能ファイルまたはコンパイル済みパッケージ)をGOPATH内の適切なディレクトリにインストールするコマンド。
  • go test: パッケージのテストを実行するコマンド。
  • go list: 指定されたパッケージに関する情報を表示するコマンド。

技術的詳細

追加された記事「About the go command」は、Goコマンドの設計哲学と、それがGoエコシステム全体に与える影響について深く掘り下げています。主要な技術的詳細と概念は以下の通りです。

  1. 設定不要なビルドの追求:

    • Goの初期目標の一つは、makefileやその他のビルド設定ファイルなしに、ソースコード内の情報のみでGoコードをビルドできることでした。
    • これは、Googleのような大規模なソフトウェア開発環境において、コンパイルの待ち時間を短縮し、ビルドプロセスの複雑さを軽減するために重要でした。
    • go commandは、この理想への回帰であり、開発者がインポートステートメントを記述する以外の設定や追加の労力を必要とせずにGoプログラムをコンパイルできるようにすることを目指しています。
  2. 設定よりも規約 (Convention over Configuration) の採用:

    • 設定不要なシステムを実現するための鍵は、明確な規約を確立することです。Goコマンドは、以下の主要な規約に厳密に従うことを要求します。
      • インポートパスの導出: インポートパスは、ソースコードのURLから既知の方法で導出されます(例: github.com/user/repo/package)。これにより、go commandは未知のインポートパスからソースコードの取得元を推測できます。
      • ローカルファイルシステムでのソースの保存場所: ソースコードは、$GOPATH/src/<import-path>という既知の場所に保存されます。これにより、Goコマンドはディレクトリ名からインポートパスを逆引きでき、多くのサブコマンドで現在のディレクトリのパッケージ名を自動的に決定できます。
      • ディレクトリとパッケージの1対1対応: ソースツリー内の各ディレクトリは、単一のGoパッケージに対応します。これにより、ファイルシステムツールがGoパッケージツールとしても機能し、パッケージのコピー、移動、削除がディレクトリの操作に対応します。
      • ソースファイル内の情報のみでのビルド: 各パッケージは、ソースファイル内に存在する情報のみを使用してビルドされます。これにより、ビルドツールが変更されても設定を更新する必要がなく、特定のツールチェーンへの依存が軽減されます。
  3. GOPATHの役割:

    • GOPATHは、go commandが必要とする唯一のグローバル設定です。これは、Goコードを保持するためのワークスペースのルートディレクトリを指定します。
    • GOPATHは複数のディレクトリのリストにすることも可能ですが、通常は単一のディレクトリに設定されます。
    • GOPATH内には、慣例としてbin(コンパイルされた実行可能ファイル)、pkg(コンパイルされたパッケージ)、src(ソースファイル)のトップレベルディレクトリが含まれます。この構造により、コンパイルされた形式とソースが常に近くに保たれ、自己完結型のディレクトリツリーが実現されます。
  4. go commandのサブコマンドの活用:

    • 記事では、go getgo listgo testgo installなどのサブコマンドの具体的な使用例が示されています。
    • go getは、リモートリポジトリからソースコードをダウンロードし、GOPATHに配置します。
    • go testは、パッケージのテストを実行します。
    • go installは、パッケージをコンパイルしてインストールし、依存関係も再帰的に更新します。
  5. go commandの限界:

    • go commandは汎用的なビルドツールではありません。ビルド中にGoソースファイルを生成する機能はありません。
    • yaccやプロトコルバッファコンパイラのようなツールを使用する場合、Goファイルを生成するためのmakefile(または選択したビルドツールの設定ファイル)を記述し、生成されたソースファイルをリポジトリにチェックインする必要があります。これはパッケージ作者にとっては追加の作業ですが、ユーザーは追加のツールを必要とせずにgo getを使用できるため、ユーザーの負担が軽減されます。

これらの技術的詳細は、Goコマンドが単なるビルドツールではなく、Go言語の設計哲学と密接に結びついた、規約に基づいた強力なエコシステムツールであることを強調しています。

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

このコミットでは、以下の2つのファイルが変更されています。

  1. doc/articles/go_command.html:

    • このファイルは新規追加されたもので、Goコマンドに関する記事のHTMLコンテンツを含んでいます。
    • ファイルの先頭には、HTMLコメント形式でタイトルが定義されています: <!--{"title": "About the go command"}-->
    • 記事は、Goコマンドの動機、設定と規約の対比、Goの規約(インポートパス、GOPATH構造、ディレクトリとパッケージの対応、ソースのみでのビルド)、Goコマンドの始め方、限界、そしてさらなる情報源について詳細に記述されています。
    • コードブロック(<pre>タグ)を使用して、go getgo listgo testgo installなどのコマンドの使用例が示されています。
    • 他のGoドキュメントへのリンク(/cmd/go//doc/code.html)も含まれています。
  2. doc/docs.html:

    • このファイルは既存のドキュメント一覧ページであり、新しい記事へのリンクが追加されています。
    • 具体的には、<h3>Tools</h3>セクションの<ul>リスト内に、以下の<li>要素が追加されています。
      <li><a href="/doc/articles/go_command.html">About the Go command</a> - why we wrote it, what it is, what it's not, and how to use it.</li>
      
    • これにより、ユーザーはGoの公式ドキュメントサイトから直接この新しい記事にアクセスできるようになります。

コアとなるコードの解説

doc/articles/go_command.html (新規追加)

このHTMLファイルは、Goコマンドの包括的な解説を提供します。

  • タイトル: About the go command
  • 導入: GoコマンドがGoパッケージとコマンドのダウンロード、ビルド、インストール、テストを自動化するツールであることを説明し、この記事がその目的、機能、そして使用方法について語ることを示します。
  • Motivation (動機):
    • Go言語が、大規模なソフトウェアのコンパイル時間を短縮するために生まれた背景を説明します。
    • Goの設計目標として、「ソースコード内の情報のみを使用してGoコードをビルドできること」が挙げられています。
    • 初期のGo開発ではmakeが使われていたが、go commandはこの理想への回帰であると述べています。
  • Configuration versus convention (設定と規約):
    • 設定不要なシステムを実現するためには規約が重要であることを強調します。
    • goinstall(現在のgo get)とその規約(インポートパスの導出、ソースの保存場所、ディレクトリとパッケージの対応、ソースのみでのビルド)がGoエコシステムを簡素化し、強力にしたと説明します。
    • makefileのような追加の設定を許可しなかったことが、go commandの開発と他のビルドシステムの排除を可能にしたと主張します。
    • go commandが汎用的なビルドツールではなく、Goパッケージのみをビルドするという重要な簡素化の前提があることを明記します。
  • Go's conventions (Goの規約):
    • Goコマンドが要求する主要な規約を詳細に説明します。
      • インポートパス: Bitbucket, GitHub, Google Code, LaunchpadなどのURLからインポートパスがどのように導出されるか、具体的な例を挙げて説明します。これにより、go commandがソースコードの取得元を推測できる利点を強調します。
      • ソースの保存場所: $GOPATH/src/<import-path>という規約に基づいた保存場所を説明します。$GOPATHが設定されていない場合のフォールバックや、複数のパスを設定した場合の動作も触れています。binpkgsrcディレクトリの構造についても言及し、自己完結型のツリーの利点を説明します。
      • ディレクトリとパッケージの対応: 各ディレクトリが単一のパッケージに対応することで、ファイルシステムツールがGoパッケージツールとしても機能する利点を説明します。
      • ソースファイル内の情報のみでのビルド: ソースファイル内の情報のみでビルドすることで、ビルド環境の変化への適応性や、特定のツールチェーンへの依存の軽減が図られることを説明します。
  • Getting started with the go command (Goコマンドの始め方):
    • $GOPATHの設定方法から始め、go getコマンドで外部パッケージをダウンロードする例を示します。
    • go listgo testコマンドの使用例も示し、./...パターンによる複数パッケージの操作方法を説明します。
    • go installコマンドが依存関係を自動的に解決してインストールする機能についても触れています。
  • Limitations (限界):
    • go commandが汎用的なビルドツールではないことを再度強調します。
    • yaccやプロトコルバッファコンパイラのようなツールでGoソースファイルを生成する場合、それらのツールで生成したファイルをリポジトリにチェックインする必要があることを説明します。これはパッケージ作者の作業を増やすが、ユーザーの負担を減らすためのトレードオフであると述べています。
  • More information (さらなる情報):
    • 「How to Write Go Code」と「go command documentation」へのリンクを提供し、さらなる学習を促します。

doc/docs.html (変更)

このファイルは、Goの公式ドキュメントサイトのナビゲーションまたは目次ページの一部です。新しい記事doc/articles/go_command.htmlへのリンクが追加されたことで、ユーザーはGoのドキュメントのトップページから直接この重要な記事にアクセスできるようになり、Goコマンドの理解を深めるための入り口が提供されます。

これらの変更は、Goコマンドの利用を促進し、その設計思想を広く共有することで、Goコミュニティ全体の開発効率と理解度を向上させることを目的としています。

関連リンク

参考にした情報源リンク