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

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

このコミットは、Go言語のドキュメンテーションツールであるgodocが、testdataという名前のディレクトリをドキュメントツリーに表示しないようにする変更を導入しています。これにより、テストに関連するデータファイルがgodocの出力に不必要に表示されることを防ぎ、ドキュメントの関連性とクリーンさを向上させます。

コミット

commit 999c77d78a7f179ec1ef13b4ab6b07853f21deb2
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Feb 23 12:23:17 2012 -0800

    godoc: don't show testdata directories
    
    R=golang-dev, bradfitz, dsymonds, minux.ma, rsc
    CC=golang-dev
    https://golang.org/cl/5700043

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

https://github.com/golang/go/commit/999c77d78a7f179ec1ef13b4ab6b07853f21deb2

元コミット内容

--- a/src/cmd/godoc/dirtrees.go
+++ b/src/cmd/godoc/dirtrees.go
@@ -17,6 +17,11 @@ import (
 	"strings"
 )
 
+// Conventional name for directories containing test data.
+// Excluded from directory trees.
+//
+const testdataDirName = "testdata"
+
 type Directory struct {
 	Depth int
 	Path  string // includes Name
@@ -49,7 +54,7 @@ type treeBuilder struct {
 }
 
 func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth int) *Directory {
-\tif b.pathFilter != nil && !b.pathFilter(path) {\n+\tif b.pathFilter != nil && !b.pathFilter(path) || name == testdataDirName {\n \t\treturn nil
 \t}
 \n

変更の背景

Go言語のプロジェクトでは、テストに関連する補助的なデータ(入力ファイル、期待される出力、その他のリソースなど)を格納するために、慣習的にtestdataという名前のディレクトリを使用します。このtestdataディレクトリは、go buildgo installといったGoツールチェーンによって無視され、最終的なバイナリには含まれません。これは、テスト専用のデータが本番環境のビルドを肥大化させないようにするためです。

godocはGoのソースコードからドキュメントを生成するツールであり、通常はパッケージのAPIや構造をユーザーに提示することを目的としています。しかし、testdataディレクトリはテストの内部実装に関連するものであり、公開されるAPIドキュメントには通常不要な情報です。

このコミット以前は、godocがディレクトリツリーを構築する際にtestdataディレクトリを通常のディレクトリとして扱っていたため、godocの出力にtestdataディレクトリが表示されていました。これは、ユーザーにとってノイズとなり、ドキュメントの目的から外れた情報を提供していました。この変更の背景には、godocの出力をよりクリーンで関連性の高いものにし、Goコミュニティにおけるtestdataディレクトリの慣習に沿った挙動を実現するという意図があります。

前提知識の解説

  • godoc: Go言語のソースコードからドキュメンテーションを生成し、HTTPサーバーとして提供するツールです。開発者がGoのパッケージや関数の使い方を理解するのに役立ちます。
  • testdataディレクトリ: Go言語のテストにおいて、テストケースが使用する補助的なデータファイル(例: テスト入力、期待される出力、設定ファイルなど)を格納するための慣習的なディレクトリ名です。このディレクトリは、Goツールチェーンによって特別に扱われ、go buildgo installの際には無視されます。これにより、テストデータが最終的なバイナリに含まれることを防ぎます。
  • token.FileSet: Goのパーサーがソースコードを解析する際に使用するファイルセットです。ソースファイルの位置情報(行番号、列番号など)を管理します。
  • pathFilter: ディレクトリツリーを構築する際に、特定のパスをフィルタリングするための関数またはメカニズムです。これにより、不要なディレクトリやファイルがツリーに含まれるのを防ぎます。

技術的詳細

この変更は、src/cmd/godoc/dirtrees.goファイル内のtreeBuilder構造体のnewDirTreeメソッドに焦点を当てています。このメソッドは、godocがディレクトリツリーを再帰的に構築する際に、各ディレクトリを処理するために呼び出されます。

変更前は、newDirTreeメソッドはb.pathFilterが設定されている場合にのみパスのフィルタリングを行っていました。b.pathFilterは、特定のパスがドキュメントツリーに含まれるべきかどうかを決定するための外部から提供されるフィルタリングロジックです。

変更後、newDirTreeメソッドの条件式に|| name == testdataDirNameが追加されました。これは論理OR演算子を使用しており、以下のいずれかの条件が真であれば、現在のディレクトリがドキュメントツリーから除外されることを意味します。

  1. b.pathFilterが設定されており、かつb.pathFilter(path)falseを返す場合(既存のフィルタリングロジック)。
  2. 現在のディレクトリの名前(name変数)が、新しく定義された定数testdataDirName(値は"testdata")と等しい場合。

この変更により、testdataという名前のディレクトリは、pathFilterの設定に関わらず、常にgodocのディレクトリツリーから除外されるようになりました。これにより、godocの出力がよりクリーンになり、テストデータがドキュメントに表示されることがなくなります。

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

変更はsrc/cmd/godoc/dirtrees.goファイルに集中しています。

  1. 新しい定数の追加:

    // Conventional name for directories containing test data.
    // Excluded from directory trees.
    //
    const testdataDirName = "testdata"
    

    testdataDirNameという新しい定数が定義され、その値は文字列"testdata"です。この定数は、testdataディレクトリの慣習的な名前を表し、コードの可読性と保守性を向上させます。コメントには、このディレクトリがテストデータを含み、ディレクトリツリーから除外されることが明記されています。

  2. newDirTreeメソッド内の条件式の変更:

    --- a/src/cmd/godoc/dirtrees.go
    +++ b/src/cmd/godoc/dirtrees.go
    @@ -49,7 +54,7 @@ type treeBuilder struct {
     }
     
     func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth int) *Directory {
    -\tif b.pathFilter != nil && !b.pathFilter(path) {\n+\tif b.pathFilter != nil && !b.pathFilter(path) || name == testdataDirName {\n \t\treturn nil
     \t}
     \n
    

    if文の条件式がb.pathFilter != nil && !b.pathFilter(path)からb.pathFilter != nil && !b.pathFilter(path) || name == testdataDirNameに変更されました。

コアとなるコードの解説

newDirTree関数は、godocがファイルシステムを走査し、ドキュメントツリーを構築する際に、各ディレクトリに対して呼び出されます。この関数は、特定のディレクトリをドキュメントツリーに含めるべきかどうかを決定します。

変更前のコードでは、b.pathFilterというフィールドが設定されている場合にのみ、そのフィルタリングロジックに基づいてディレクトリを含めるかどうかを判断していました。これは、ユーザーがgodocに特定のパスを無視させるための汎用的なメカニズムでした。

変更後のコードでは、この既存のフィルタリングロジックに加えて、|| name == testdataDirNameという条件が追加されました。

  • nameは現在処理しているディレクトリの名前です。
  • testdataDirNameは、新しく定義された定数で、その値は"testdata"です。

この論理OR (||) 演算子により、以下のいずれかの条件が満たされた場合、newDirTree関数はnilを返します。nilを返すことは、そのディレクトリがドキュメントツリーに含められないことを意味します。

  1. b.pathFilterが設定されており、かつそのフィルタが現在のパスを拒否する場合。
  2. 現在のディレクトリの名前が"testdata"である場合。

したがって、この変更により、testdataという名前のディレクトリは、godocのドキュメントツリーから自動的に除外されるようになりました。これにより、godocの出力がより関連性の高い情報のみを含むようになり、ユーザーエクスペリエンスが向上します。

関連リンク

参考にした情報源リンク