广告:Codex Token 低价中转站稳定接口 · 快速接入 · 开发者备用通道
Engineering article

代码自动化怎么文档自动生成?AI编程新范式

代码自动化文档生成不是什么高大上的概念,它就是一套能让你在写代码的同时,自动产出高质量文档的工具链。我见过很多团队在用 Swagger 自动生成 API 文档,或者用 Sphinx 把注释转成 markdown,但真正能落地的方案,往往不是工具本身,而是怎么把工具和项目结构绑定。比如在 Python 项目里,我用 sphinx-apido

代码自动化怎么文档自动生成?AI编程新范式
配图来源于网络和AI生成,仅供参考。
▌ 技术引导
代码自动化文档生成不是什么高大上的概念,它就是一套能让你在写代码的同时,自动产出高质量文档的工具链。我见过很多团队在用 Swagger 自动生成 API 文档,或者用 Sphinx 把注释转成 markdown,但真正能落地的方案,往往不是工具本身,而是怎么把工具和项目结构绑定。比如在 Python 项目里,我用 sphinx-apidoc 生成源码目录结构,然后加上 autodoc 和 napoleon 扩展,直接从代码里提取注释和函数参数,生成带例子的 API 文档。这玩意儿虽然简单,但必须配置好 docstrings 格式,否则输出一堆垃圾。
更狠的是,有些项目直接用 PyPI 上的库,比如 doctr 或者 mkdocstrings,把这些库 hook 到 CI/CD 流程里,每次 push 就自动更新文档。这类工具能帮你省下 80% 的文档编写时间。不过别被它骗了,文档质量还是得靠你写,工具只是帮你打辅助。
我踩过一个坑,就是用 JSDoc 自动生成前端文档,结果配置的时候没注意 comment 的格式,导致生成的文档字段乱七八糟。后来发现必须用 @param、@returns 这些标签,而且要写在函数前,否则完全识别不出来。还有个问题是静态分析工具和文档生成工具的兼容性,比如用 ESLint 和 JSDoc 一起用的时候,如果不加 ignores,每次构建都报一堆错误。
总之,文档自动化不是让你完全不用写文档,而是让你写得更精准、更高效。关键在于工具链的选型和配置,以及如何在项目结构里埋好钩子,让工具能精准抓取信息。实操的时候别光看文档,得自己动手试,不然根本不知道哪些地方会出问题。

▌ 技术参考

一 配置 Sphinx 自动生成文档
在 Python 项目中,Sphinx 是个老生常谈的文档工具,但它的自动化能力非常强。你可以用 sphinx-apidoc 这个命令,直接从源码目录生成 rst 文件。例如:
```bash
sphinx-apidoc -o docs/source/ ../your_project_dir
```
这里 -o 后面是输出目录,后面的是源码根目录。生成的 rst 会包含所有模块、类和函数的 docstring。想让 Sphinx 识别你的注释格式,必须安装 napoleon 扩展:
```bash
pip install sphinx napoleon
```
然后在 conf.py 里加入:
```python
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon']
```
如果文档里没有注释,Sphinx 会生成空内容,所以注释是关键。

二 JSDoc 与 TypeScript 注释联动
JSDoc 是前端文档的利器,特别是在 TypeScript 项目中。它能自动识别你的类型注解,生成带参数说明和类型提示的 API 文档。配置方式也很简单,只需要在 tsconfig.json 中开启 jsdoc 选项:
```json
{
"compilerOptions": {
"jsDoc": true
}
}
```
然后用 JSDoc 命令生成 html:
```bash
jsdoc -r -t ./node_modules/jsdoc/dist/theme-default -d ./docs ./src
```
如果注释格式不对,比如没有 @param 或 @returns,文档会生成一堆废话。记得在函数前写注释,且要符合 JSDoc 标准,这样生成的文档才不会乱。

三 MkDocs 使用 mkdocstrings 读取源码
MkDocs 虽然是个静态网站生成器,但搭配 mkdocstrings 能实现文档自动化。先在 requirements.txt 里安装:
```txt
mkdocs
mkdocstrings[python]
```
然后配置 mkdocs.yml,加入 plugins 部分:
```yaml
plugins:
- search
- mkdocstrings
```
再在 docs/index.md 中用 markdown 的方式引入模块:
```markdown
```python
from your_module import some_function
```
```
这样 mkdocstrings 会自动读取 your_module.py 中的 docstrings,生成带参数说明的文档。这个方式适合中型项目,不需要额外引入文档编辑工具。

四 用 Draft.js 配合代码注释生成文档
Draft.js 是个 React 编辑器,但也可以用来做文档自动生成。你在写代码的时候,用注释写文档内容,然后用 Draft.js 的钩子函数抓取这些注释,存入数据库。比如在 JavaScript 中,用注释写:
```javascript
// @doc: this is a function that does something
function exampleFunc() { ... }
```
然后用正则表达式提取这些注释,存入 MongoDB。这样你可以在写代码的时候直接写文档内容,不需要额外切换编辑器。这种方式适合需要多人协作的项目,文档和代码统一维护。

五 CI/CD 集成文档自动生成
文档自动生成必须和 CI/CD 整合,否则没人会去更新。比如在 GitHub Actions 中,配置一个 job,每次 push 时运行文档生成命令:
```yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Generate Docs
run: |
npx jsdoc -r -t ./node_modules/jsdoc/dist/theme-default -d ./docs ./src
```
这样文档就会自动更新,不会有人手动去维护。但要注意,CI/CD 里不能写日志到本地,得配置成只输出到远程仓库或者私有服务器。这种方案适合团队项目,文档和代码一起提交。

六 技术文档的模板化实践
文档生成的核心是模板化,不然你写一堆注释也没用。我见过有人用 Jekyll 或 Hugo 搞模板,但它们都是静态网站,不能直接读取代码注释。所以最好的方式是用 mkdocstrings 或 autoapi,直接读取注释生成 markdown。比如在 Sphinx 中,可以配置 autoapi 的路径:
```python
autoapi_type = 'python'
autoapi_dirs = ['../your_project/your_module']
autoapi_generate_module_index = False
autoapi_member_order = 'bysource'
```
这样生成的文档会按照代码顺序排列,并且自动提取成员函数和类。如果模块太多,建议用 glob 模式,比如:
```python
autoapi_dirs = ['../your_project/']
```
但要注意,Sphinx 会把所有模块都拉过来,容易导致文档冗余。所以建议只导入核心模块。

七 注释格式统一问题
文档自动生成最大的雷就是注释格式不统一。我之前用 Sphinx 时,有人写 docstring 用 triple double quotes,有人用 single quotes,结果生成的文档全部乱套。后来强制统一格式,用 Black 或 Prettier 格式化代码,确保所有注释的格式一致。例如在 Python 中,用 PEP 257 标准:
```python
"""
This is a function that does something.

Args:
param1 (int): Description of param1.
param2 (str): Description of param2.

Returns:
str: Description of return value.
"""
def some_func(param1, param2):
# implementation
```
同样,在 JavaScript 中,必须用 JSDoc 格式,否则工具根本识别不了。格式统一后,生成文档的效率直接提升。

八 自动生成文档的性能考量
文档自动生成不是越快越好,质量更重要。如果你用 Sphinx 或 JSDoc 生成文档,每次构建会遍历所有代码文件,找出符合条件的注释。这个过程如果在大型项目中,可能会卡住。我之前做过一个项目,有 2000+ 个文件,用 Sphinx 生成文档要 2 分钟,严重影响 dev 阶段的体验。后来换用 autoapi,它只处理你指定的模块,速度提升 5 倍。关键是你要控制生成范围,不能一股脑全拉出来。

九 文档自动生成的适用边界
文档自动生成适合文档内容靠代码注释驱动的场景。比如 API 文档、函数说明、类结构介绍,这类内容都可以用工具自动提取。但不适用于流程图、架构图、设计文档等需要人工梳理的内容。我之前在一个项目里,误把系统设计文档也交给 Sphinx 生成,结果文档全是空的。后来发现是没写注释,所以直接换成了手写。
另外,文档自动生成对代码质量要求高,如果代码随便写,注释不规范,生成的文档完全没用。所以文档生成是代码质量的镜子,不能忽视。

十 使用 autoapi 生成 Python 文档
autoapi 是 Sphinx 的一个插件,能自动读取 Python 模块中的 docstrings,并生成 markdown 文档。部署方式很简单,在 conf.py 里加:
```python
extensions = ['autoapi.extension']
autoapi_type = 'python'
autoapi_dirs = ['../your_project']
autoapi_generate_module_index = False
```
然后运行 sphinx-apidoc 命令生成初始文档,再用 make html 生成 html。这个方式的优点是不需要手动写文档,直接从代码里提取。但缺点是文档结构不够精细,比如函数之间的依赖关系无法展示。所以建议配合其他工具使用,比如文档中加入依赖图。

十一 Markdown 与文档生成工具的协作
很多文档生成工具支持 markdown 输入,比如 MkDocs、Docusaurus。你可以在代码中用注释写 markdown 内容,然后用工具提取。例如在 Python 中,用 markdown 格式写注释:
```python
"""
# function description
This function does something.

## Parameters
- `param1`: description
- `param2`: another description

## Returns
- `str`: description
"""
def some_func(param1, param2):
# implementation
```
然后用 mkdocstrings 把这些内容提取出来,生成文档。这种方式适合需要展示长文案的场景,比如项目介绍、使用指南。但如果注释里有 markdown 标记,记得要转义,否则生成的文档会乱。

十二 使用 Pydantic 模型自动生成文档
Pydantic 是个热门的 Python 数据验证库,但它的模型也能用来生成文档。比如你在定义一个模型时,用字段注释写文档:
```python
from pydantic import BaseModel

class User(BaseModel):
name: str = Field(description="User's name")
age: int = Field(description="User's age")
```
然后用 fastapi 的自动文档功能,直接生成 swagger。这种方式适合 API 项目,文档和模型完全绑定,修改模型注释,文档自动更新。但要注意,Pydantic 的 Field 语法必须正确,否则文档会生成错误。

十三 实时文档生成与热更新
有些文档生成工具支持热更新,比如 Sphinx 自带的 autodoc,在代码修改后能自动重新生成文档。这在本地开发时特别方便。比如在 VSCode 中,安装 Sphinx 插件,然后运行:
```bash
sphinx-autogen -d docs/source/api docs/source/api.rst
```
这样每次代码改动后,文档就自动更新。但要注意,热更新不能替代全量文档生成,只能用来调试。正式文档还是得跑完整流程,确保内容正确。

十四 Markdown 文档与 Sphinx 的整合
如果你在写 markdown 文档,但又想用 Sphinx 自动生成 API 部分,可以结合 autoapi 和 markdown。比如在 Sphinx 中设置:
```python
extensions = ['autoapi.extension', 'sphinx.ext.todo', 'sphinx.ext.coverage']
autoapi_type = 'python'
autoapi_dirs = ['../your_project']
autoapi_generate_module_index = False
```
然后在 docs/index.md 中用 markdown 写介绍,再用 autoapi 生成 API 部分。这样文档结构清晰,内容也统一。但要注意,Sphinx 的文档结构和 markdown 不兼容,需要在构建命令中指定:
```bash
make html
```
这样就能把 markdown 和 autoapi 文档合并输出了。

十五 使用 Jekyll 的 api 文档生成技巧
Jekyll 本身不支持自动文档生成,但可以通过 api 文档插件来做。比如用 jekyll-api-docs,把注释提取成 YAML 格式,然后自动导入。在 Ruby 项目中,配置:
```yaml
gems:
- jekyll-api-docs
```
然后写注释:
```ruby
# @api: some_function
# @param: arg1 (int)
# @return: string
def some_function(arg1)
# code
end
```
再用 jekyll build 命令生成站点,这样就能产出 API 文档。但 Jekyll 的流程比较老,适合小型项目,如果项目复杂,还是推荐用 MkDocs 或 Sphinx。