Hugo × Cloudflare Pages

2026-10-21 · Hugo / Cloudflare

一条命令从 Markdown 到线上

改完文章,敲一次 python deploy.py -p my-site,十秒后线上就是新版本。中间没有 commit、没有 push、没有排队等 CI。

这条链路做了什么

deploy.py 只做三件事,全是子进程调用:

  1. 删掉 public/,避免上一次的残留文件跟着上线
  2. 跑 hugo --minify --gc -d public,产出纯静态文件
  3. 跑 wrangler pages deploy public --project-name <名字>
shutil.rmtree(PUBLIC, ignore_errors=True)
run([hugo_bin(), "--minify", "--gc", "-d", str(PUBLIC)])
run(["wrangler", "pages", "deploy", str(PUBLIC),
     "--project-name", a.project, "--branch", a.branch, "--commit-dirty=true"])

Python 这边只用了标准库:argparse 管参数,subprocess 管外部命令,shutil 管删目录。没有第三方依赖,换台机器 pip install 都不用跑。

为什么值得这么干

静态站最贵的不是构建,是等待。

Git 集成的体验是:改一行字 → commit → push → 等 CI 排队 → 等构建 → 刷新。快则一分钟,慢则十分钟。直传把这段压缩成一次本地命令,失败信息还直接打在终端里。

对比一下两种模式:

维度直传(本项目)Git 集成
上线延迟构建 + 上传,通常 10 秒级排队 + 构建,分钟级
报错可见性就在本地终端得翻构建日志
版本追溯靠 --commit-hash 手动带天然绑定 commit
多人协作各自本地推,易冲突天然统一入口
是否互斥项目创建时二选一同左

一句话结论:一个人写、频繁改、要立刻看到结果的站,选直传;多人协作、需要审计留痕的站,选 Git 集成。

几个容易踩的坑

  • public/ 不删就构建,删掉的文章还会留在线上 —— 每次部署都是全量快照。
  • 生产分支名必须和项目创建时的 --production-branch 一致,否则你以为在发生产,其实发的是预览环境。
  • wrangler pages deploy 没有 --dry-run,传了这个参数它只会把帮助文档打给你看。
  • 单次部署上限 20000 个文件、单文件 25 MiB。图片多的站要注意。

下一步可以看为什么不用 Git 集成。