2026-10-21 · Hugo / Cloudflare
一条命令从 Markdown 到线上
改完文章,敲一次 python deploy.py -p my-site,十秒后线上就是新版本。中间没有 commit、没有 push、没有排队等 CI。
这条链路做了什么
deploy.py 只做三件事,全是子进程调用:
- 删掉
public/,避免上一次的残留文件跟着上线 - 跑
hugo --minify --gc -d public,产出纯静态文件 - 跑
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 集成。