GoDocを静的ファイルでエクスポートする
pkgsite には静的ファイルでエクスポートするオプションは無い。旧来の godoc にも無いので古くから以下のイシューが未解決のまま存在している。
イシューのログには回避策として wget でダウンロードするものがあったけれど、最初の方にあるコマンドはおそらく godoc 用となっていて、2025年6月時点では使えない。読み進めるとtymonxのコードスニペットがあって、これも pkgsite の変更で使えなくなっていたけれど、設定するべきオプション等は参考になった。
なので自分でコマンドラインを構築する必要があり、実際に試してうまくいったのが以下のコードとなる。
go tool pkgsite -h 2>/dev/null
go tool pkgsite -http=:8080 & # TODO: add -cachepid="$!"
mod="$(go list -f '{{.Module.Path}}')"rm -rf godocmkdir 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" || truekill "$pid"まず pkgsite が動作するまで少し時間があるため wget でリトライをするのだが、初回実行時にモジュールをダウンロードしてビルドが発生するため、起動する前にリトライが尽きてしまう場合がある。そのため pkgsite -h で事前にモジュールのダウンロードだけ済ませている。この代わりに go mod download でも要件は満たせるが、全てのモジュールをダウンロードすることになって時間がかかるし、プライベートリポジトリの参照で困ることもあるので、今の方法が良いと思う。
次に、pkgsite は色々な外部リンクを持っているけれど、無作為にダウンロードすると時間もかかるし容量も大きくなるので —accept-regex= などwgetのオプションで関心のあるモジュールだけを対象にしている。それと手元では ?tab=versions や ?tab=imported のデータがなくて424エラーになっていたので、—content-on-error オプションを与えてエラーであってもファイルを生成するようにした。最後の || true はGitHub Actionsのrunディレクティブはエラーが起きたときに停止するので対策している。本当は5xxエラーが起きたときだけコマンドの結果をエラーにしたいが、そういったオプションはたぶん無い。