维护开源项目或工具清单时,经常会遇到一个问题:数据文件改了,README 忘记同步。时间一长,两边对不上,要么手动逐条复制,要么干脆摆烂。
这篇文章用一个真实场景——书签工具清单——来演示怎么用 GitHub Actions + Python 脚本,实现「只改 bookmarks.yaml,README 自动更新」的工作流。
思路 整个方案分两部分:
Python 脚本:读取 bookmarks.yaml,按固定格式生成 README.md GitHub Actions:监听 bookmarks.yaml 的变动,自动触发脚本并提交结果 改动 bookmarks.yaml 之后,不管是本地 push 还是直接在 GitHub 网页上编辑,都会自动触发,不需要手动运行任何命令。
数据文件结构 bookmarks.yaml 的结构很简单,每个分类包含图标、名称和工具列表:
- category: 编程工具 icon: 🛠️ items: - name: Zed url: https://zed.dev/ desc: 轻量极速的现代代码编辑器 opensource: true - name: WezTerm url: https://wezfurlong.org/wezterm desc: 高性能跨平台终端模拟器 opensource: true opensource: true 是可选字段,没有这个字段默认视为非开源。
Python 脚本 新建 gen_readme.py,放在仓库根目录:
#!/usr/bin/env python3 import yaml HEADER = """# 🛠️ tools > 精选隐私友好、开源优先的实用工具清单。 > A curated list of privacy-friendly, open-source tools I actually use. 🔓 = 开源 / Open Source --- """ FOOTER = """ --- 欢迎提 Issue 或 PR 推荐新工具。 """ def generate_readme(yaml_path="bookmarks.yaml", output_path="README.md"): with open(yaml_path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) lines = [HEADER] for category in data: icon = category.get("icon", "") name = category.get("category", "") items = category.get("items", []) lines.append(f"## {icon} {name}\n") lines.append("| 工具 | 描述 | 开源 |") lines.append("|------|------|------|") for item in items: tool_name = item.get("name", "") url = item.get("url", "") desc = item.get("desc", "") opensource = "🔓" if item.get("opensource") else "" lines.append(f"| [{tool_name}]({url}) | {desc} | {opensource} |") lines.append("") lines.append(FOOTER.strip()) with open(output_path, "w", encoding="utf-8") as f: f.write("\n".join(lines)) print(f"✅ README.md 已生成,共 {len(data)} 个分类") if __name__ == "__main__": generate_readme() 几个关键点:
...