Golang为Go包生成静态文档的方法

Golang为Go包生成静态文档的方法 代码仓库:https://gitlab.com/tslocum/godoc-static

演示输出:https://docs.rocketnine.space

受最近 godoc.org 关闭的消息启发,我创建了 godoc-static。虽然我们都可以迁移到 pkg.go.dev,但我们也可以自行托管和更新我们的文档。

当被调用时,会启动 godoc -http=localhost:####,抓取相关的包文档页面和源代码,并重写以修复样式、展开内容等,然后终止 godoc 进程。

请注意,虽然看起来一切正常,但到目前为止我只专注于交付 MVP。此处可能存在未知问题。例如,为了让它在我的 VPS 上运行,我必须将 GO111MODULE 设置为 off,并将相关的包源代码克隆到 GOPATH 中。


更多关于Golang为Go包生成静态文档的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我已经花了一些时间来完善这个项目,现在应该可以投入使用了。我非常期待大家对这个项目的任何反馈。

文档现在也会写入到 docs.zip 文件中,以便没有安装 godoc 的用户后续离线访问。

更多关于Golang为Go包生成静态文档的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常实用的工具,godoc-static 解决了Go包文档自托管的关键需求。它通过自动化抓取和重写 godoc 生成的页面,生成了完全静态、可独立部署的文档网站。

下面是一个典型的使用示例和工作流程:

1. 安装与基本使用

# 安装 godoc-static
go install gitlab.com/tslocum/godoc-static@latest

# 为当前包生成文档(需在 GOPATH 模式下)
GO111MODULE=off godoc-static -out ./docs

2. 为特定包生成文档

# 生成标准库 net/http 包的静态文档
godoc-static -pkg net/http -out ./http-docs

# 生成多个包的文档
godoc-static -pkg fmt,encoding/json,strings -out ./std-docs

3. 完整配置示例

// 通过环境变量配置(兼容旧版本Go)
export GO111MODULE=off
export GOPATH=$HOME/go

// 克隆目标仓库到GOPATH
git clone https://github.com/example/pkg $GOPATH/src/github.com/example/pkg

// 生成带自定义选项的文档
godoc-static \
  -pkg github.com/example/pkg \
  -out ./public/docs \
  -godoc-port 6060 \
  -include-source \
  -verbose

4. 自动化脚本示例

#!/bin/bash
# build_docs.sh - 自动化文档生成脚本

set -e

# 配置
PKG="github.com/yourusername/yourpackage"
OUT_DIR="./docs"
GODOC_PORT=8080

# 清理旧文档
rm -rf "$OUT_DIR"

# 生成新文档
echo "正在为 $PKG 生成静态文档..."
GO111MODULE=off \
godoc-static \
  -pkg "$PKG" \
  -out "$OUT_DIR" \
  -godoc-port $GODOC_PORT \
  -timeout 120s

# 验证生成结果
if [ -f "$OUT_DIR/index.html" ]; then
    echo "文档生成成功!"
    echo "输出目录: $OUT_DIR"
    echo "文件数量: $(find "$OUT_DIR" -type f | wc -l)"
else
    echo "文档生成失败!"
    exit 1
fi

5. 集成到Go项目的Makefile

.PHONY: docs clean-docs serve-docs

# 文档生成配置
DOCS_DIR := docs
PKG_PATH := $(shell go list -m)
GODOC_PORT := 6060

# 生成静态文档
docs:
	@echo "正在生成静态文档..."
	GO111MODULE=off godoc-static \
		-pkg $(PKG_PATH) \
		-out $(DOCS_DIR) \
		-godoc-port $(GODOC_PORT)
	@echo "文档已生成到 $(DOCS_DIR)/"

# 清理文档
clean-docs:
	rm -rf $(DOCS_DIR)

# 本地预览文档
serve-docs:
	python3 -m http.server 8000 --directory $(DOCS_DIR)

# 完整构建流程
all: clean-docs docs

6. Docker容器化部署示例

# Dockerfile.docs
FROM golang:1.19-alpine AS builder

# 安装 godoc-static
RUN GO111MODULE=off go install gitlab.com/tslocum/godoc-static@latest

# 设置工作目录
WORKDIR /src
COPY . .

# 生成静态文档
RUN GO111MODULE=off \
    godoc-static \
    -pkg $(go list -m) \
    -out /docs \
    -godoc-port 8080

# 使用Nginx提供文档服务
FROM nginx:alpine
COPY --from=builder /docs /usr/share/nginx/html
EXPOSE 80

关键注意事项:

  1. GOPATH要求:当前版本需要GOPATH环境,因为godoc工具在模块模式下有限制:
# 必须设置
export GO111MODULE=off
export GOPATH=$HOME/go

# 确保包在正确位置
mkdir -p $GOPATH/src/github.com/user/repo
  1. 网络依赖:生成过程中会启动本地godoc服务器,需要临时端口可用。

  2. 样式优化:工具会自动重写CSS和HTML,确保静态页面与原始godoc显示一致。

这个工具特别适合需要内网部署、定制化文档样式或归档特定版本文档的场景。虽然pkg.go.dev是官方选择,但godoc-static提供了完全自主控制的替代方案。

回到顶部