Skip to content

GoDocを静的ファイルでエクスポートする

pkgsite には静的ファイルでエクスポートするオプションは無い。旧来の godoc にも無いので古くから以下のイシューが未解決のまま存在している。

イシューのログには回避策として wget でダウンロードするものがあったけれど、最初の方にあるコマンドはおそらく godoc 用となっていて、2025年6月時点では使えない。読み進めるとtymonxのコードスニペットがあって、これも pkgsite の変更で使えなくなっていたけれど、設定するべきオプション等は参考になった。

なので自分でコマンドラインを構築する必要があり、実際に試してうまくいったのが以下のコードとなる。

Terminal window
go tool pkgsite -h 2>/dev/null
go tool pkgsite -http=:8080 & # TODO: add -cache
pid="$!"
mod="$(go list -f '{{.Module.Path}}')"
rm -rf godoc
mkdir godoc
wget \
--recursive \
--level=inf \
--tries=10 \
--retry-connrefused \
--waitretry=3 \
--content-on-error \
--quiet \
--show-progress \
--convert-links \
--page-requisites \
--adjust-extension \
--restrict-file-names=unix \
--execute=robots=off \
--accept-regex="^(http://localhost:8080)?/(static|$mod|files)" \
--directory-prefix=godoc \
--no-host-directories \
"http://localhost:8080/$mod" || true
kill "$pid"

まず pkgsite が動作するまで少し時間があるため wget でリトライをするのだが、初回実行時にモジュールをダウンロードしてビルドが発生するため、起動する前にリトライが尽きてしまう場合がある。そのため pkgsite -h で事前にモジュールのダウンロードだけ済ませている。この代わりに go mod download でも要件は満たせるが、全てのモジュールをダウンロードすることになって時間がかかるし、プライベートリポジトリの参照で困ることもあるので、今の方法が良いと思う。

次に、pkgsite は色々な外部リンクを持っているけれど、無作為にダウンロードすると時間もかかるし容量も大きくなるので —accept-regex= などwgetのオプションで関心のあるモジュールだけを対象にしている。それと手元では ?tab=versions?tab=imported のデータがなくて424エラーになっていたので、—content-on-error オプションを与えてエラーであってもファイルを生成するようにした。最後の || trueGitHub Actionsのrunディレクティブはエラーが起きたときに停止するので対策している。本当は5xxエラーが起きたときだけコマンドの結果をエラーにしたいが、そういったオプションはたぶん無い。