1. 项目概述一个极简主义博客引擎的诞生最近在折腾个人博客发现市面上的方案要么太重要么太复杂。对于一个只想安静写点东西的人来说那些动辄需要数据库、复杂后台、一堆插件的系统实在是有些“杀鸡用牛刀”。直到我遇到了stackblogger/cavewoman这个项目它的名字就很有意思——“洞穴女人”听起来原始、直接、不花哨。这正是一个极简主义静态博客生成器的精髓回归写作本身用最原始、最直接的工具构建一个纯粹的内容空间。cavewoman本质上是一个用 Go 语言编写的命令行工具。它的目标非常明确将你用 Markdown 写的文章快速、高效地转换成一套干净、可部署的静态网站。它没有后台管理界面没有评论系统甚至没有分类和标签至少核心版本如此它只做一件事——把文本变成网页。这种“极简”哲学对于开发者、技术写作者或者任何厌倦了复杂 CMS 系统的人来说有着致命的吸引力。你不需要关心服务器性能、数据库优化、安全漏洞因为生成的就是一堆 HTML、CSS 和 JS 文件随便扔到 GitHub Pages、Netlify 或者任何静态托管服务上就能跑速度快得飞起安全得一塌糊涂。我自己从 WordPress 迁移到 Hugo再尝试过 Jekyll 和 Hexo最终发现对于个人博客这种低频更新、内容为王的站点工具的“心智负担”越小越好。cavewoman就是在这种需求下诞生的。它可能不适合需要复杂交互、多用户协作的站点但对于一个独立的思考者一个“数字洞穴”的建造者来说它提供了近乎完美的解决方案你只需要一个文本编辑器和你的思想。2. 核心设计哲学与架构拆解2.1 为什么是“极简主义”在讨论技术细节之前我们必须先理解cavewoman背后的设计哲学。这个名字本身就充满了隐喻。“洞穴”象征着私密、专注和回归本质。在信息爆炸的时代我们的注意力被无数花哨的 UI、推送通知和社交功能撕碎。一个博客尤其是个人博客其核心价值应当是内容本身是作者思想的沉淀。cavewoman的设计者显然深谙此道它刻意剥离了所有非核心功能。这种极简带来几个直接好处速度没有数据库查询没有服务端渲染没有复杂的模板引擎开销。生成的是预渲染的静态文件访问时就是纯粹的 CDN 分发加载速度是动态网站无法比拟的。安全没有动态执行环境如 PHP、Node.js攻击面急剧缩小。你几乎不用担心 SQL 注入、XSS如果模板设计得当或远程代码执行漏洞。静态文件托管服务本身的安全性就很高。可移植性与版本控制你的整个博客就是一堆文本文件Markdown和配置文件。可以用 Git 进行完美的版本管理迁移到任何支持静态托管的平台都轻而易举。低成本与零维护托管在 GitHub Pages、Cloudflare Pages 等服务上完全免费。你不需要维护服务器、更新系统、打安全补丁从部署那天起它几乎不需要你再投入任何运维精力。cavewoman不是要做一个功能大而全的平台而是要做一个“锋利”的工具。它假设用户具备基本的命令行操作能力和文本编辑能力将控制权完全交还给用户。这种“不替用户做决定”的态度反而赋予了用户最大的灵活性。2.2 技术栈选型Go 语言的魅力项目选用 Go 语言作为实现语言这是一个非常契合其哲学的选择。编译为单一二进制文件这是 Go 的杀手锏之一。cavewoman编译后就是一个独立的可执行文件没有任何外部依赖。用户下载后无论在 macOS、Linux 还是 Windows 上直接运行即可。这彻底解决了环境配置、依赖库版本冲突等令人头疼的问题极大地降低了使用门槛。卓越的并发性能与执行速度Go 的 goroutine 和 channel 机制使得并发处理变得简单高效。在生成博客时可能需要并行读取多个 Markdown 文件、解析、渲染模板Go 能轻松利用多核 CPU 优势让生成过程快如闪电。对于内容不多的博客可能是“秒级”生成。强大的标准库Go 的标准库已经非常丰富涵盖了 HTTP 服务器、模板引擎、文件操作、Markdown 解析通过第三方库如goldmark等方方面面。这意味着cavewoman可以用很少的外部依赖就构建出核心功能保持项目的轻量和健壮。部署简单作为静态站点生成器它本身不需要运行一个常驻的 Go 服务。它的生命周期就是“运行命令生成文件然后退出”。这种一次性任务非常适合 Go 这种编译型语言启动快资源释放干净。注意虽然cavewoman本身是 Go 写的但作为用户你完全不需要懂 Go。你只需要把它当成一个黑盒工具来用。这是工具设计成功的一个标志将复杂性封装在内部对外提供简单的接口。2.3 核心工作流解析cavewoman的工作流清晰得令人发指通常只需要三步初始化在空目录下运行cavewoman init它会创建一个基本的项目骨架包括默认的配置文件、文章目录、模板目录和静态资源目录。写作在content/posts/目录下创建你的.md文件。文件头部是 YAML 格式的 Front Matter元数据用于定义标题、日期、摘要等后面跟着 Markdown 格式的正文。生成与预览运行cavewoman build生成静态网站到public/目录。运行cavewoman serve会在本地启动一个开发服务器实时预览效果。当你对修改满意后将public/目录的内容部署到任何静态托管服务即可。这个流程和 Hugo、Jekyll 等主流静态生成器类似但cavewoman的配置项和目录结构通常更少更强调“约定优于配置”。它可能只提供一两个默认主题鼓励用户根据自己的需求去修改而不是从海量主题中挑选。这再次体现了其“工具”属性——它提供基础能力外观和扩展由用户自己动手。3. 从零开始实践搭建你的“数字洞穴”3.1 环境准备与工具安装首先你需要获取cavewoman这个工具。由于它是 Go 项目最直接的方式是通过 Go 的包管理工具安装。确保你的系统已经安装了 Go1.16 或以上版本。# 使用 go install 从 GitHub 直接安装最新版本 go install github.com/stackblogger/cavewomanlatest安装完成后在终端输入cavewoman --help如果能看到帮助信息说明安装成功。这个二进制文件通常会被安装到$GOPATH/bin或$GOBIN目录下请确保该目录在你的系统 PATH 环境变量中。除了cavewoman本身你只需要两样东西一个文本编辑器VS Code、Sublime Text、Vim、Neovim 任选其一。推荐使用对 Markdown 有良好支持如实时预览、语法高亮的编辑器。一个终端用于执行命令。这就是全部了。不需要数据库不需要 Web 服务器软件甚至不需要 Node.js 或 Python 环境。这种极致的简洁是高效开始的基石。3.2 项目初始化与目录结构剖析找一个你喜欢的目录打开终端执行# 创建一个新的博客目录并进入 mkdir my-digital-cave cd my-digital-cave # 使用 cavewoman 初始化项目 cavewoman init执行成功后你会看到类似以下的目录结构被创建出来my-digital-cave/ ├── config.yaml # 站点全局配置文件 ├── content/ # 内容目录 │ └── posts/ # 所有文章放在这里 ├── layouts/ # 模板目录 │ ├── _default/ # 默认模板 │ │ ├── baseof.html # 基础布局模板 │ │ ├── list.html # 文章列表页模板 │ │ └── single.html # 文章详情页模板 │ └── index.html # 首页模板 ├── static/ # 静态资源目录图片、CSS、JS │ ├── css/ │ └── images/ └── themes/ # 主题目录可选我们来逐一解读config.yaml这是博客的大脑。在这里定义博客标题、描述、作者、语言、主题、分页规则等所有全局设置。cavewoman的配置文件通常非常精简可能只有十几行。content/posts/这是你的“洞穴壁画”存放地。每一篇.md文件就是一篇文章。文件命名通常建议使用YYYY-MM-DD-slug.md的格式例如2023-10-27-hello-cavewoman.md这有助于保持有序。layouts/这是博客的“骨架”和“皮肤”。模板文件决定了生成的 HTML 长什么样。cavewoman可能使用 Go 标准库的html/template包语法直观。baseof.html定义了整个页面的基本框架如head、页头、页脚single.html定义了单篇文章的渲染方式list.html定义了文章列表页如首页、归档页的渲染方式。static/存放所有不需要处理的静态文件。你写的 CSS 样式表、JavaScript 脚本、以及文章里引用的图片都放在这里。在模板中可以通过/css/style.css这样的相对路径引用它们。themes/如果你不想从头设计模板可以在这里放置第三方主题。不过以cavewoman的极简风格社区主题可能不多更鼓励你自己动手。实操心得在初始化后我建议你先别急着写文章。花点时间浏览一遍生成的默认模板和配置文件理解每个部分的作用。特别是config.yaml里的每个键值对尝试修改一下然后重新生成看看页面发生了什么变化。这能帮你快速建立起对工具的控制感。3.3 撰写你的第一篇文章现在让我们在content/posts/目录下创建第一篇文章。# 创建一个新的 Markdown 文件 touch content/posts/2023-10-27-welcome-to-my-cave.md用编辑器打开这个文件输入以下内容--- title: 欢迎来到我的数字洞穴 date: 2023-10-27T15:30:0008:00 draft: false # 是否为草稿true则不会在构建时发布 summary: 这是我的第一篇使用 Cavewoman 构建的文章记录一下这个极简博客的诞生。 --- ## 为什么选择 Cavewoman 在这个充斥着复杂 CMS 和臃肿框架的时代我一直在寻找一个能让我**专注写作**的工具。Cavewoman 的极简哲学深深吸引了我。 ### 核心优势 1. **速度**生成的静态页面加载飞快。 2. **简单**无需数据库无需复杂配置。 3. **自由**完全掌控内容和样式。 ## 下一步计划 我将在这里记录我的技术思考、阅读笔记和生活片段。这个洞穴很简陋但它是完全属于我的。 ![一张洞穴壁画风格的配图](/images/cave-painting.jpg) !-- 图片需要放在 static/images/ 目录下 --Front Matter 解析title文章标题。date文章发布日期和时间。使用 RFC3339 格式时区信息很重要。draft草稿标记。设为true时文章在正式构建 (cavewoman build) 时会被忽略但在开发服务器 (cavewoman serve) 中仍可预览非常适合写作中。summary文章摘要通常用于列表页显示。正文部分就是标准的 Markdown 语法你可以使用所有常见的标记如标题、列表、代码块、链接、图片等。cavewoman会通过配置的 Markdown 解析器很可能是goldmark将其转换为 HTML。3.4 本地构建与实时预览文章写好了我们来看看效果。# 生成静态网站到 public/ 目录 cavewoman build # 启动本地开发服务器默认通常在 http://localhost:1313 cavewoman serve执行cavewoman serve后它会自动在浏览器中打开页面或者告诉你访问地址。更棒的是很多静态生成器包括cavewoman很可能具备支持热重载Live Reload。这意味着你修改了文章内容、模板或配置文件后保存文件浏览器中的页面会自动刷新无需手动重启服务器。这对于写作和调试样式来说是极大的效率提升。打开浏览器访问本地服务器地址。你应该能看到一个非常简洁的博客页面首页是文章列表显示了刚写的那篇文章的标题、摘要和日期点击标题就能进入文章详情页看到渲染好的完整内容。注意事项cavewoman build和cavewoman serve是两个不同的命令。build是“生产模式”会进行完整的优化如压缩 HTML、CSS生成最终用于部署的文件。serve是“开发模式”侧重于快速和热重载可能不会进行优化。在部署前务必使用build命令重新生成一次public/目录。4. 深度定制打造独一无二的洞穴风格4.1 理解模板引擎与数据传递cavewoman的核心魔力在于模板。它充当了数据你的 Markdown 文章和站点配置与输出HTML 页面之间的桥梁。你需要了解模板中可以使用哪些“变量”。在layouts/_default/single.html中你可能会看到这样的结构{{ define main }} article h1{{ .Title }}/h1 time datetime{{ .Date.Format 2006-01-02T15:04:05Z07:00 }}{{ .Date.Format January 2, 2006 }}/time div classcontent {{ .Content }} /div /article {{ end }}{{ define main }}定义了一个名为 “main” 的模板块。{{ .Title }}、{{ .Date }}、{{ .Content }}这里的点号.代表了当前页面的上下文对象。在文章详情页这个对象就是这篇文章本身包含了 Front Matter 里定义的所有字段以及渲染后的正文内容。{{ .Date.Format ... }}这是 Go 模板函数用于格式化日期。Go 语言的日期格式化比较特殊它使用一个固定的参考时间Mon Jan 2 15:04:05 MST 2006的布局来定义格式。除了文章对象在模板中你还可以访问站点全局信息通常通过{{ .Site }}对象。例如{{ .Site.Title }}来自config.yaml的站点标题。{{ .Site.Params.description }}来自config.yaml的自定义参数。{{ .Site.RegularPages }}获取所有非草稿的常规页面文章。理解这些数据对象是自定义模板的基础。你可以尝试在模板中打印{{ printf %#v . }}来查看当前上下文下所有可用的变量和结构这是一个非常实用的调试技巧。4.2 自定义样式与布局默认的模板可能很朴素这正是我们发挥创意的地方。所有的样式都定义在static/css/目录下。你可以创建一个style.css文件然后通过修改layouts/_default/baseof.html中的head部分来引入它。static/css/style.css:/* 一个极简的深色主题示例 */ :root { --bg-color: #1a1a1a; --text-color: #e0e0e0; --link-color: #64b5f6; --border-color: #333; } body { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, sans-serif; line-height: 1.8; max-width: 800px; margin: 2rem auto; padding: 0 1rem; background-color: var(--bg-color); color: var(--text-color); } article { border-top: 1px solid var(--border-color); padding-top: 2rem; } a { color: var(--link-color); text-decoration: none; } a:hover { text-decoration: underline; } code { background-color: #2d2d2d; padding: 0.2em 0.4em; border-radius: 3px; font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace; }修改layouts/_default/baseof.html:!DOCTYPE html html lang{{ .Site.LanguageCode }} head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }}/title !-- 引入自定义CSS -- link relstylesheet href{{ css/style.css | absURL }} !-- 可以在这里引入字体、图标库等 -- /head body header h1a href{{ / | absURL }}{{ .Site.Title }}/a/h1 p{{ .Site.Params.description }}/p /header main {{ block main . }}{{ end }} /main footer p© {{ now.Format 2006 }} {{ .Site.Params.author }}. Built with a hrefhttps://github.com/stackblogger/cavewomanCavewoman/a./p /footer /body /html通过修改 CSS 和 HTML 模板你可以实现任何你想要的风格从极简黑白到复古像素风完全由你掌控。这是使用cavewoman这类工具最大的乐趣之一——创造独一无二的视觉身份。4.3 扩展功能短代码与自定义输出虽然cavewoman极简但并不意味着不能扩展。一种常见的方式是使用“短代码”。短代码是你在 Markdown 中插入的一种特殊标记它会在渲染时被替换成一段复杂的 HTML 或执行一段逻辑。例如假设你想在文章中轻松嵌入一个警告框。你可以先在模板中定义一个短代码在layouts/shortcodes/目录下创建文件warning.html如果目录不存在就创建div classwarning-box strong注意/strong {{ .Inner }} /div在你的文章 Markdown 中这样使用以下是重要提示 {{ warning }} 此操作不可逆请务必提前备份数据。 {{ /warning }}渲染时{{ warning }}...{{ /warning }}之间的内容会被传递给短代码模板中的{{ .Inner }}变量最终生成一个带有警告样式的div块。另一种扩展是自定义页面类型。除了posts你还可以创建content/about.md来生成一个“关于我”的页面或者content/links.md生成一个友链页面。你只需要为这些页面创建对应的模板例如layouts/about/single.htmlcavewoman会自动匹配。实操心得不要试图一开始就实现所有功能。先从最核心的文章发布开始然后根据需要一点点添加。比如先写好文章列表和详情页稳定运行一段时间后如果你觉得需要分类再考虑通过给文章添加categories字段并创建一个分类列表页模板。这种渐进式的构建方式能让你始终保持对项目的掌控避免过度设计。5. 部署上线让你的洞穴面向世界5.1 生成最终文件当你对博客的内容和样式都满意后就可以生成用于生产环境的文件了。确保config.yaml中的baseURL设置正确例如https://yourusername.github.io或你的自定义域名。# 清理旧的 public 目录并重新构建 rm -rf public cavewoman build检查public/目录里面应该包含了所有静态文件index.html、posts/子目录下的各个文章页面、css/、images/等。这就是你的整个网站。5.2 选择托管平台静态站点的托管选择非常多以下是最常见的几种平台优点缺点适用场景GitHub Pages完全免费与 Git 无缝集成支持自定义域名需 CNAME。构建有频率和资源限制不支持服务端动态功能。个人博客、项目文档、技术作品集。Netlify免费层功能强大提供持续部署、HTTPS、表单处理、服务器端函数等。免费层有带宽和构建分钟数限制。需要更高级功能如重定向、身份验证的静态站点。Vercel对前端框架优化好部署速度极快开发者体验优秀。同样有使用限制更侧重于现代前端应用。JAMStack 应用、Next.js 等框架项目。Cloudflare Pages全球 CDN 速度快免费额度高与 Cloudflare 生态集成好。相对较新某些高级功能可能不如 Netlify 成熟。追求极致速度和全球访问的站点。自有服务器/Nginx完全控制无第三方限制。需要自己维护服务器、配置 SSL 证书等。对控制和隐私有极高要求的用户。对于个人博客GitHub Pages通常是首选因为它简单、免费且可靠。5.3 部署到 GitHub Pages在 GitHub 上创建一个新的仓库命名为yourusername.github.io将yourusername替换为你的 GitHub 用户名。这是使用 GitHub Pages 个人站点的特殊命名约定。将你的博客项目初始化为 Git 仓库如果还没做的话并关联到远程仓库git init git add . git commit -m Initial commit with Cavewoman git branch -M main git remote add origin https://github.com/yourusername/yourusername.github.io.git由于我们要部署的是public/目录下的生成文件而不是源码一个常见的做法是使用一个单独的gh-pages分支或者利用 GitHub Actions 自动构建。更简单的方法是如果你不介意公开源码可以直接将整个项目推送到main分支然后配置 GitHub Pages 源为/ (root)。但更干净的做法是只推送public目录。 这里推荐一个巧妙的方案在项目根目录创建一个.gitignore文件忽略public/然后使用一个部署脚本# 部署脚本 deploy.sh #!/bin/bash echo -e \033[0;32mDeploying updates to GitHub...\033[0m # 构建站点 cavewoman build # 切换到 public 目录 cd public # 初始化 public 目录为独立的 git 仓库如果尚未 git init git add . # 提交更改 msgrebuilding site $(date) if [ -n $* ]; then msg$* fi git commit -m $msg # 推送到 gh-pages 分支 git push -f https://github.com/yourusername/yourusername.github.io.git main:gh-pages # 回到项目根目录 cd ..运行bash deploy.sh即可一键部署。记得先在 GitHub 仓库设置中将 Pages 的源分支设置为gh-pages。等待几分钟访问https://yourusername.github.io你的“数字洞穴”就正式对外开放了。5.4 配置自定义域名如果你有自己的域名想让博客看起来更专业可以很容易地配置自定义域名。在域名注册商那里为你的域名添加两条 CNAME 记录以 Cloudflare 为例类型CNAME名称目标yourusername.github.io。将根域名指向 GitHub Pages类型CNAME名称www目标yourusername.github.io。将 www 子域名也指向 GitHub Pages在你的博客项目根目录下static/文件夹里创建一个名为CNAME的文件没有后缀里面只写一行你的域名例如blog.yourname.com。重新构建并部署你的博客。在 GitHub 仓库的 Settings - Pages 页面在 “Custom domain” 部分填入你的域名并保存。GitHub 会自动为你配置 HTTPS 证书可能需要等待一段时间。完成这些步骤后你的极简博客就拥有了一个完全属于自己的、快速、安全且免费的网上家园。6. 进阶技巧与问题排查6.1 性能优化与最佳实践即使静态站点已经很快我们仍可以追求极致。图片优化这是影响页面加载速度的最大因素。压缩使用工具如Squoosh、TinyPNG或命令行工具imagemagick、cwebp在上传前压缩图片。懒加载在图片标签中添加loadinglazy属性现代浏览器支持。响应式图片根据不同的屏幕尺寸提供不同大小的图片。这可以通过前端脚本或一些 SSG 插件实现在cavewoman中可能需要手动处理或使用短代码。考虑使用 CDN将图片托管在专门的图片 CDN如 Cloudinary、Imgix或对象存储如 AWS S3、Cloudflare R2可以进一步加速全球访问。CSS/JS 最小化在构建时可以使用工具如minify自动压缩 CSS 和 JavaScript 文件移除空格和注释。你可以写一个简单的构建后脚本或者寻找 Go 相关的资源优化库集成到cavewoman的构建流程中。利用浏览器缓存通过配置托管平台的 HTTP 头如 Netlify 的_headers文件或 Cloudflare 的页面规则为静态资源CSS、JS、图片设置较长的缓存时间如一年减少重复下载。保持内容简洁这是最重要的“优化”。避免嵌入过多第三方小部件、追踪代码和社交分享按钮每一个外部请求都会增加页面加载时间。cavewoman的极简风格天然鼓励这一点。6.2 常见问题与解决方案在实践过程中你可能会遇到一些问题。这里记录一些常见的情况问题1本地cavewoman serve运行正常但部署后样式/图片丢失。原因最可能的原因是路径问题。在本地服务器上路径可能是相对的但在部署到子路径如username.github.io/repo-name或根域名时相对路径会出错。解决在config.yaml中确保baseURL设置正确例如https://username.github.io/或https://yourdomain.com/。在模板中始终使用绝对路径或带absURL过滤器的路径。例如错误link relstylesheet hrefcss/style.css正确link relstylesheet href{{ css/style.css | absURL }}正确img src{{ /images/photo.jpg | absURL }}absURL过滤器会确保路径总是相对于baseURL的绝对路径。问题2文章日期显示不正确或格式混乱。原因时区处理不当或日期格式字符串写错。解决在 Front Matter 中日期尽量使用带时区的完整格式date: 2023-10-27T15:30:0008:00。在模板中格式化日期时使用 Go 的参考时间格式。例如{{ .Date.Format 2006-01-02 }}输出2023-10-27{{ .Date.Format January 2, 2006 }}输出October 27, 2023{{ .Date.Format 15:04 MST }}输出15:30 CST如果想根据访问者所在地显示本地时间这需要前端 JavaScript 来实现因为静态生成时时间是固定的。问题3想添加站内搜索功能。解决静态站点实现搜索有几种方案客户端搜索使用 JavaScript 库如lunr.js、flexsearch或minisearch。在构建时 (cavewoman build)可以写一个脚本遍历所有文章提取标题、内容和链接生成一个搜索索引 JSON 文件。然后在前端页面加载这个 JSON 文件用 JS 库进行本地搜索。这种方式无需服务器但文章数量巨大时索引文件可能会比较大。第三方服务使用 Algolia 这样的专业搜索服务。它们提供免费的额度索引构建和搜索逻辑都由服务端完成你只需要在前端嵌入一段代码。功能强大但引入外部依赖。 对于cavewoman这种极简博客如果文章不多客户端搜索是更符合其哲学的选择。你可以将这个索引生成步骤集成到你的部署脚本中。问题4想添加评论系统。解决同样由于是静态站点无法直接处理表单提交。主流方案是使用第三方服务Disqus最知名但可能加载较慢有广告。Utterances基于 GitHub Issues非常适合技术博客。评论以 Issue 的形式存储在你的仓库里无需额外数据库。Giscus类似 Utterances但基于 GitHub Discussions。Telegram Comments基于 Telegram 频道。 选择一种服务获取其嵌入代码然后将其作为一个部分Partial添加到你的layouts/_default/single.html模板中通常放在文章正文之后。6.3 内容管理与写作流最后分享一个我个人高效的内容管理和写作流程这可能比技术细节更有价值一切皆文本我的所有博客草稿、想法片段都用一个纯文本笔记软件如 Obsidian、Logseq或直接放在项目的content/drafts/目录下管理。用 Git 进行版本控制。使用 VS Code 写作VS Code 有优秀的 Markdown 预览插件并且可以配置代码片段快速插入常用的 Front Matter 模板。本地实时预览写作时始终开着cavewoman serve边写边看效果即时调整。草稿模式善用draft: true标记。写了一半的文章设为草稿它不会出现在正式构建中但可以在本地预览避免发布未完成的内容。自动化部署将前面提到的deploy.sh脚本化或者更进一步使用 GitHub Actions。你可以在每次向main分支推送 Markdown 源码时自动触发 Actions 来运行cavewoman build并将public/目录部署到gh-pages分支。这样你只需要git push网站就自动更新了。使用cavewoman这类工具最终收获的不仅仅是一个博客更是一套完全受控、高度可定制、并且能伴随你技能成长的内容发布系统。它从复杂中抽象出简单把创造力交还给创作者本身。当你习惯了这种写作和发布的节奏你会发现专注于内容创作本身是一件多么令人愉悦的事情。你的“数字洞穴”里最终沉淀下来的将是你最纯粹的思想结晶。