[インデックス 12521] ファイルの概要
このコミットは、Go言語の公式ドキュメント生成および提供ツールであるgodoc
の機能拡張と、それに伴うドキュメントのビルドプロセスの変更に関するものです。具体的には、godoc
がテンプレートを直接処理してHTMLを生成する機能が追加され、これまで外部ツールであったtmpltohtml
が不要になりました。これにより、ドキュメントのビルドプロセスが簡素化され、godoc
自体がドキュメントのレンダリングを一元的に担うようになりました。
コミット
commit a40065ac6838068f07dcb12084406bab403067f2
Author: Russ Cox <rsc@golang.org>
Date: Thu Mar 8 08:39:20 2012 -0500
cmd/godoc: add support for serving templates
doc: convert to use godoc built-in templates
tmpltohtml is gone, to avoid having a second copy of the code.
Instead, godoc -url /doc/go1.html will print the actual HTML
served for that URL. "make" will generate files named go1.rawhtml
etc, which can be fed through tidy.
It can be hard to tell from the codereview diffs, but all the
tmpl files have been renamed to be html files and then
have "Template": true added.
R=golang-dev, adg, r, gri
CC=golang-dev
https://golang.org/cl/5782046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/a40065ac6838068f07dcb12084406bab403067f2
元コミット内容
このコミットの元々の内容は以下の通りです。
cmd/godoc
: テンプレートを提供する機能を追加。doc
:godoc
の組み込みテンプレートを使用するように変換。tmpltohtml
ツールは、コードの重複を避けるために廃止されました。- 代わりに、
godoc -url /doc/go1.html
を実行すると、そのURLで提供される実際のHTMLが出力されるようになります。 make
コマンドは、go1.rawhtml
などのファイルを生成し、これらはtidy
コマンドで整形できます。- コードレビューの差分からは分かりにくいかもしれませんが、全ての
.tmpl
ファイルが.html
ファイルにリネームされ、"Template": true
というメタデータが追加されています。
変更の背景
この変更の背景には、Go言語のドキュメント生成プロセスにおける効率化と一貫性の向上が挙げられます。
- コードの重複排除: 以前は、Goのドキュメント(特に記事やチュートリアル)は
.tmpl
ファイルとして記述され、tmpltohtml
という別のツールを使ってHTMLに変換されていました。このtmpltohtml
は、godoc
が内部で使用しているテンプレートエンジンと類似のロジックを持っていたため、コードの重複が発生していました。このような重複は、メンテナンスの複雑さを増し、将来的な機能追加やバグ修正の際に二重の作業を必要とする可能性がありました。 - ビルドプロセスの簡素化:
tmpltohtml
という中間ツールを廃止し、godoc
自体がテンプレートのレンダリングを直接行えるようにすることで、ドキュメントのビルドプロセスが簡素化されます。これにより、Makefile
などのビルドスクリプトもよりシンプルになり、開発者の負担が軽減されます。 godoc
の一元化:godoc
はGoのコードドキュメントを生成・表示するための主要なツールです。このツールにドキュメントのテンプレート処理機能も統合することで、Goのドキュメントに関する全ての処理をgodoc
に一元化し、ツールの役割を明確にするとともに、全体的なエコシステムの一貫性を高める狙いがあります。- 動的なコンテンツ生成への対応:
godoc
が直接テンプレートを処理できるようになることで、将来的にはより動的なコンテンツや、サーバーサイドでのリアルタイムなドキュメント生成・表示といった機能拡張への道が開かれます。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
-
Go言語の
text/template
およびhtml/template
パッケージ:- Go言語には、テキストやHTMLを生成するためのテンプレートエンジンが標準ライブラリとして提供されています。
text/template
は汎用的なテキスト生成に、html/template
はHTMLの生成に特化しており、クロスサイトスクリプティング(XSS)攻撃を防ぐための自動エスケープ機能を持っています。- これらのテンプレートは、
{{.FieldName}}
のようなプレースホルダーや、{{range .Items}}...{{end}}
のような制御構造、{{if .Condition}}...{{end}}
のような条件分岐などを用いて、動的にコンテンツを生成します。 godoc
は、これらのテンプレートエンジンを利用して、Goのソースコードから抽出した情報(型、関数、変数、コメントなど)を整形して表示します。
-
godoc
ツール:godoc
は、Go言語のソースコードからドキュメントを生成し、Webサーバーとして提供するツールです。- 開発者がコードに記述したコメント(特にエクスポートされた要素に対するコメント)を解析し、Goの標準的なドキュメント形式に変換して表示します。
- 通常、
godoc -http=:8000
のように実行することで、ローカルでドキュメントサーバーを立ち上げることができます。 - このコミット以前は、
godoc
は主にコードドキュメントの表示に特化しており、Goの公式ウェブサイトに掲載されるような記事やチュートリアル(.tmpl
ファイルで書かれたもの)は、別のツールでHTMLに変換する必要がありました。
-
tmpltohtml
ユーティリティ(廃止前):- このコミットで廃止された
tmpltohtml
は、Goのドキュメントリポジトリ内で使用されていたカスタムツールです。 .tmpl
拡張子を持つテンプレートファイルを読み込み、それをHTMLファイルに変換する役割を担っていました。- これは、
godoc
が直接テンプレートを処理する機能を持っていなかったための中間ステップでした。
- このコミットで廃止された
-
Makefile
:Makefile
は、ソフトウェアのビルドプロセスを自動化するためのスクリプトファイルです。make
コマンドによって実行され、ファイルの依存関係に基づいてコマンドを実行します。- このコミットでは、
Makefile
内のtmpltohtml
の呼び出しが削除され、代わりにgodoc -url
コマンドが使用されるように変更されています。
-
Goのドキュメントにおける
{{code}}
ディレクティブ:- Goの公式ドキュメントや記事では、コード例を埋め込むために
{{code "path/to/file.go" "/start_regex/" "/end_regex/"}}
のような特殊なディレクティブが使用されていました。 - これは、指定されたGoソースファイルから、正規表現で指定された範囲のコードを抽出し、ドキュメント内に表示するためのものです。
- このコミットでは、このディレクティブのパス指定が変更され、
godoc
が内部で解決できるように調整されています。
- Goの公式ドキュメントや記事では、コード例を埋め込むために
技術的詳細
このコミットの技術的な変更点は多岐にわたりますが、主要なものは以下の通りです。
-
godoc
へのテンプレートサービング機能の追加:src/cmd/godoc/main.go
およびsrc/cmd/godoc/doc.go
に、HTTPリクエストに応じてGoテンプレートをレンダリングするロジックが追加されました。- これにより、
godoc
は単にGoコードのドキュメントを生成するだけでなく、特定のURLパス(例:/doc/go1.html
)に対するリクエストを受け取った際に、対応するテンプレートファイルを読み込み、動的にHTMLを生成して返すことができるようになりました。 - 特に、
godoc -url <path>
コマンドが導入され、指定されたパスに対応するHTMLコンテンツを標準出力に出力できるようになりました。これは、ビルドプロセスで静的なHTMLファイルを生成するために利用されます。
-
.tmpl
ファイルから.html
ファイルへの移行とメタデータの追加:doc/articles/
やdoc/
直下にあった.tmpl
拡張子のファイル(例:effective_go.tmpl
,go1.tmpl
)が、対応する.html
拡張子のファイルにリネームされました。- これらの新しい
.html
ファイルの先頭には、JSON形式のメタデータブロックが追加されました。例えば、<!--{"Title": "Defer, Panic, and Recover", "Template": true}-->
のように、"Template": true
というキーが追加されています。 - この
"Template": true
というフラグは、godoc
がこのHTMLファイルを単なる静的なHTMLとしてではなく、内部のテンプレートエンジンで処理すべきテンプレートとして認識するためのマーカーとなります。これにより、{{code}}
などの特殊なディレクティブが適切に解釈・展開されるようになります。
-
tmpltohtml.go
の廃止とsrc/cmd/godoc/template.go
への統合:- 以前は独立したツールであった
doc/tmpltohtml.go
が削除されました。 - その機能は
src/cmd/godoc/template.go
としてgodoc
の内部に統合されました。これは、godoc
がテンプレートを直接処理する能力を獲得したことを意味します。 - この統合により、テンプレートの解析、コード例の埋め込み(
{{code}}
ディレクティブの処理)、HTMLの生成といったロジックがgodoc
のコードベース内で一元管理されることになります。
- 以前は独立したツールであった
-
Makefile
の変更:doc/Makefile
が大幅に簡素化されました。tmpltohtml
のビルドと実行に関するルールが削除されました。- 代わりに、
.rawhtml
ファイルを生成するための新しいルールが追加されました。このルールは、godoc -url /doc/$* >$@
というコマンドを実行し、godoc
自身にHTMLコンテンツを生成させています。 - 生成されるファイル名も
.html
から.rawhtml
に変更され、これはtidy
などの後処理を前提としていることを示唆しています。
-
{{code}}
ディレクティブのパス解決の変更:- ドキュメント内の
{{code}}
ディレクティブのパス指定が、progs/defer.go
のような相対パスから/doc/progs/defer.go
のような絶対パス(godoc
のURLパスとしての)に変更されました。 - これは、
godoc
がWebサーバーとして動作する際に、これらのパスを適切に解決して対応するコードスニペットを埋め込むためです。
- ドキュメント内の
これらの変更により、Goのドキュメント生成は、外部ツールへの依存を減らし、godoc
を中心としたより統合された、効率的なワークフローへと移行しました。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は以下のファイルに集中しています。
-
doc/Makefile
:tmpltohtml
のビルドと実行に関する行が削除されました。HTML
変数がRAWHTML
に変更され、生成されるファイル名が.html
から.rawhtml
に変わりました。%.html: %.tmpl tmpltohtml
というルールが削除され、代わりに%.rawhtml: %.html
という新しいルールが追加されました。この新しいルールでは、godoc -url /doc/$* >$@
が実行され、godoc
自身がHTMLを生成するようになりました。
-
doc/articles/*.html
およびdoc/*.html
ファイル群:defer_panic_recover.tmpl
->defer_panic_recover.html
など、全ての.tmpl
ファイルが対応する.html
ファイルにリネームされました。- リネームされた各
.html
ファイルの先頭に、<!--{"Title": "...", "Template": true}-->
という形式のJSONメタデータブロックが追加されました。特に"Template": true
が重要です。 - ファイル内の
<!--{{code "..."}}-->
形式のコメントが削除され、{{code "..."}}
という直接的なテンプレートディレクティブに置き換えられました。また、{{code}}
ディレクティブ内のパスが、progs/defer.go
のような相対パスから/doc/progs/defer.go
のようなgodoc
のURLパス形式に変更されました。
-
doc/tmpltohtml.go
:- このファイル自体が完全に削除されました。
-
src/cmd/godoc/doc.go
:godoc
がドキュメントを処理する際のロジックが変更され、新しいテンプレート処理機能が組み込まれました。- 特に、
godoc
が"Template": true
メタデータを持つHTMLファイルをテンプレートとして認識し、内部でレンダリングするための変更が含まれています。
-
src/cmd/godoc/godoc.go
:godoc
のメインロジックに、テンプレートサービングに関連する新しいハンドラや設定が追加された可能性があります。
-
src/cmd/godoc/main.go
:godoc
コマンドラインツールのエントリポイントであり、新しい-url
フラグの処理や、テンプレートサービング機能の初期化に関する変更が含まれています。
-
doc/tmpltohtml.go => src/cmd/godoc/template.go
:- これはファイルのリネームと移動を示しており、
tmpltohtml
の機能がgodoc
の内部モジュールとしてsrc/cmd/godoc/template.go
に統合されたことを意味します。このファイルには、テンプレートの解析、コードスニペットの埋め込みなどのロジックが含まれています。
- これはファイルのリネームと移動を示しており、
これらの変更は、Goのドキュメント生成と提供のアーキテクチャを根本的に変更し、godoc
をより強力で汎用的なドキュメントツールへと進化させました。
コアとなるコードの解説
このコミットの核心は、godoc
がGoのドキュメントを生成する際の「テンプレートエンジン」としての役割を強化した点にあります。
以前は、Goのドキュメント(特に記事やチュートリアル)は.tmpl
ファイルとして書かれ、tmpltohtml
という外部ツールによって静的なHTMLファイルに変換されていました。この変換プロセスでは、{{code "..."}}
のような特殊なディレクティブが、実際のGoソースコードスニペットに置き換えられていました。
このコミットでは、このtmpltohtml
の機能をgodoc
自体に組み込みました。
-
doc/Makefile
の変更:- 最も分かりやすい変更は
Makefile
です。以前はtmpltohtml
を実行して.tmpl
ファイルを.html
に変換していましたが、新しいMakefile
ではgodoc -url /doc/$* >$@
というコマンドを使っています。 - これは、
godoc
に対して特定のURLパス(例:/doc/go1.html
)に対応するHTMLコンテンツを生成し、それを標準出力に書き出すように指示しています。この出力が.rawhtml
ファイルとして保存されます。 - この変更により、ドキュメントのビルドパイプラインから
tmpltohtml
という中間ステップが完全に削除されました。
- 最も分かりやすい変更は
-
ドキュメントファイルの変更(
.tmpl
から.html
へ、メタデータの追加):- 全てのドキュメントファイルが
.tmpl
から.html
にリネームされました。これは、これらのファイルが最終的にHTMLとして提供されることを明確にするためです。 - 重要なのは、これらの新しい
.html
ファイルの先頭に<!--{"Title": "...", "Template": true}-->
というJSON形式のコメントが追加されたことです。"Title"
はドキュメントのタイトルを示します。"Template": true
というキーは、godoc
に対して「このHTMLファイルは単なる静的なHTMLではなく、内部のテンプレートエンジンで処理すべきテンプレートである」と明示的に伝えます。
- これにより、
godoc
はこれらのファイルを読み込んだ際に、通常のHTMLとしてではなく、Goのhtml/template
パッケージで処理されるべきテンプレートとして扱います。
- 全てのドキュメントファイルが
-
godoc
内部の変更(template.go
への統合と処理ロジック):tmpltohtml.go
のコードがsrc/cmd/godoc/template.go
としてgodoc
の内部に移動・統合されました。- この
template.go
には、Goのテンプレートエンジン(html/template
)を使用して、ドキュメントファイル内の{{code "..."}}
ディレクティブを実際のGoソースコードスニペットに置き換えるロジックが含まれています。 godoc
がWebサーバーとして動作する際、/doc/
以下のパスへのリクエストを受け取ると、対応する.html
ファイルを読み込み、そのメタデータ("Template": true
)をチェックします。- もし
"Template": true
が設定されていれば、godoc
はファイルの内容をテンプレートとして解析し、{{code}}
ディレクティブを解決して、最終的なHTMLを生成してクライアントに返します。 godoc -url
コマンドも同様に、内部のテンプレート処理ロジックを利用してHTMLを生成します。
この一連の変更により、Goのドキュメントは、godoc
という単一のツールによって、ソースコードのドキュメント生成から、記事やチュートリアルのテンプレート処理、そして最終的なHTMLの提供まで、一貫して管理されるようになりました。これにより、ビルドプロセスが簡素化され、コードの重複が解消され、Goのドキュメントエコシステム全体がより堅牢でメンテナンスしやすくなりました。
関連リンク
- Go言語公式ドキュメント: https://go.dev/doc/
godoc
コマンドのドキュメント: https://pkg.go.dev/cmd/godoc- Goのテンプレートパッケージ (
text/template
,html/template
):
参考にした情報源リンク
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
- このコミットのコードレビューページ: https://golang.org/cl/5782046 (コミットメッセージに記載されているURL)
- Go言語の公式ブログ (
godoc
やテンプレートに関する過去の記事がある可能性): https://go.dev/blog/ - Go言語のGitHubリポジトリ: https://github.com/golang/go
- Go言語のドキュメントリポジトリ (変更されたファイルが含まれる): https://github.com/golang/go/tree/master/doc
- Go言語のソースコード (
src/cmd/godoc
ディレクトリ): https://github.com/golang/go/tree/master/src/cmd/godoc