<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ForeverYang's 博客</title><link>https://mythstraw.github.io/</link><description>ForeverYang's 博客 的最新内容</description><generator>Hugo</generator><language>zh-cn</language><managingEditor>mythstraw@msn.com (ForeverYang)</managingEditor><webMaster>mythstraw@msn.com (ForeverYang)</webMaster><copyright>Copyright © 2026, ForeverYang</copyright><lastBuildDate>Wed, 30 Sep 2026 21:59:00 +0800</lastBuildDate><atom:link href="https://mythstraw.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>停止 AI 焦虑！四象限规则帮你做减法</title><link>https://mythstraw.github.io/p/ai-anxiety-four-quadrants/</link><pubDate>Wed, 30 Sep 2026 21:59:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/ai-anxiety-four-quadrants/</guid><description>&lt;h2 id="你有没有下面这些焦虑">你有没有下面这些焦虑&lt;/h2>
&lt;p>AI 发展日新月异，急速迭代，概念、技术、产品层出不穷。&lt;br>
很多比较流行的 AI 相关的东西，我们不可能都花时间去了解、理解、深度使用研究。&lt;br>
&lt;em>一方面希望自己跟上 AI 的浪潮，另一方面自己的时间和精力又不允许。&lt;/em>&lt;br>
而且，&lt;em>AI 迭代速度太快，刚出的产品或者概念，没过多久就过时了。&lt;/em>&lt;br>
所以如何解决这些问题呢？四象限法则就可以帮助我们做出合理的判断。&lt;/p>
&lt;h2 id="什么是四象限法则">什么是四象限法则&lt;/h2>
&lt;blockquote>
&lt;p>&lt;em>四象限法则由史蒂芬·柯维提出，用&amp;quot;重要性 × 紧急性&amp;quot;将任务分为四类：重要且紧急、重要但不紧急、紧急但不重要、不重要且不紧急，用于确定优先级并提升时间管理效率&lt;/em>&lt;/p>&lt;/blockquote>
&lt;p>很多人应该听说过这个概念，可能用过在时间管理上面，比如一些待办 todo 的应用，番茄时钟应用，把计划和待办做重要且紧急、重要但不紧急、紧急但不重要、不重要且不紧急四大分类，就可以帮助我们确定一件事的优先级，哪些先做，哪些按计划去做，哪些可以忽略不用急着去做。&lt;/p>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-cd0dda6f"
 class="image-zoom-toggle"
 aria-label="放大图片：四象限法则在时间管理上的应用"
 />
 &lt;label
 for="img-cd0dda6f"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/time-management-quadrant.png"
 alt="四象限法则在时间管理上的应用"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-cd0dda6f"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/time-management-quadrant.png"
 alt="四象限法则在时间管理上的应用"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>四象限法则在时间管理上的应用&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;p>那么这个规则又如何帮助我们解决 AI 焦虑呢？&lt;/p>
&lt;blockquote>
&lt;p>这是通过宝玉老师的文章学到的 &lt;a href="https://baoyu.io/blog/ai-learning-priority-quadrant" target="_blank" rel="noopener noreferrer">AI 发展太快跟不上？一张四象限图帮你做减法&lt;/a>
&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="解决-ai-焦虑用生产力和保鲜期做减法">解决 AI 焦虑：用&amp;quot;生产力&amp;quot;和&amp;quot;保鲜期&amp;quot;做减法&lt;/h2>
&lt;p>解决 AI 焦虑，就问这两个问题：&lt;/p>
&lt;ol>
&lt;li>它离&lt;strong>我当前的生产力&lt;/strong>有多近？（能不能让我现在的活干得更快或更好？）&lt;/li>
&lt;li>这个知识的&lt;strong>保鲜期&lt;/strong>有多长？（三年后还能用，还是三个月后就改名了？）&lt;/li>
&lt;/ol>
&lt;p>把这两个问题作为横纵轴，就能把 AI 资讯分成四类，对应四种完全不同的处理方式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>直接跳过（离得远 + 保鲜期短）&lt;/strong>：比如每个月变的模型跑分排名、某家 AI 公司的融资八卦、各种不知名的小套壳。这些是噪音最密集的地方，过早关注只会增加沉没成本。如果它真重要，半年后你自然会听到。&lt;/li>
&lt;li>&lt;strong>维持地图感（离得远 + 保鲜期长）&lt;/strong>：比如 RAG（检索增强生成）、思维链（CoT）、Scaling Laws。你不需要自己去写代码实现它们，但你得知道它们是什么、能解决什么问题。花 15 分钟读篇好文章，确保和同事聊天时能听懂就行，不动手，不装环境。&lt;/li>
&lt;li>&lt;strong>浅尝辄止（离得近 + 保鲜期短）&lt;/strong>：比如某个刚火的 AI 画图工具的具体提示词套路。它确实能帮你省时间，值得花几个小时上手试试。但千万别花一周去精通它的每个参数，因为产品形态可能下个月就大变，你积累的特定技巧会一夜贬值。&lt;/li>
&lt;li>&lt;strong>深度死磕（离得近 + 保鲜期长）&lt;/strong>：这是真正值得投入精力的地方。比如软件工程的核心思维、上下文工程（Context Engineering），或者像 Claude Code 这样有大厂持续投入的核心编程智能体。深度使用一个核心工具带来的复利，远大于浅尝十个新玩具。&lt;/li>
&lt;/ul>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-af076129"
 class="image-zoom-toggle"
 aria-label="放大图片：AI 学习优先级四象限"
 />
 &lt;label
 for="img-af076129"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/ai-learning-quadrant.png"
 alt="AI 学习优先级四象限"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-af076129"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/ai-learning-quadrant.png"
 alt="AI 学习优先级四象限"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>AI 学习优先级四象限&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="四象限法则让你的-ai-变得更强大">四象限法则，让你的 AI 变得更强大&lt;/h2>
&lt;p>最近有一个基于&amp;quot;乔哈里视窗&amp;quot;改造的 AI 提示词框架非常火。它把人和 AI 的认知分成了四个象限。如果你能把这四句话写进你的系统提示词（System Prompt）里，AI 的产出质量会有质的飞跃。&lt;/p>
&lt;p>&lt;strong>1. 共同已知（我和 AI 的已知）：给足背景，让它闭嘴干活&lt;/strong>&lt;br>
先确认任务目标、已有背景、交付标准和明确边界。信息给充分了，就直接告诉它：&amp;ldquo;信息已充分，请直接执行，不要重复询问或说废话。&amp;ldquo;这能极大消除 AI 那种令人烦躁的&amp;quot;过度礼貌&amp;quot;和无效反问。&lt;/p>
&lt;p>&lt;strong>2. 我的已知（但 AI 的未知）：喂给它你的&amp;quot;潜规则&amp;rdquo;&lt;/strong>&lt;br>
AI 不知道你老板的审美偏好、你们公司的历史遗留代码规范，或者某个业务的真实限制。如果这些信息缺失会搞砸结果，你必须说出来。如果信息太多，可以定个规矩：&amp;ldquo;如果缺失关键信息，最多向我提 3 个问题；否则，请基于你的合理假设，先给我一个探索版本。&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>3. 我的未知（但 AI 的已知）：让它来挑你的刺&lt;/strong>&lt;br>
这是把 AI 当&amp;quot;思考伙伴&amp;quot;的关键。明确告诉它：&amp;ldquo;不要局限于我的原始方案。请主动补充我没考虑到的知识、方法、潜在风险和替代方案。如果我的前提可能错误，请直接指出，并给出更优建议及取舍依据。&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>4. 双方未知：别瞎猜，设计个最小实验&lt;/strong>&lt;br>
遇到前沿问题或复杂业务，谁也给不出完美答案。这时候提示词应该引导 AI：&amp;ldquo;我们把这个问题转化为可验证的假设。请帮我设计一个最小实验（MVP），说明要改变的单一变量是什么、成功或失败的信号是什么，以及后续需要回收什么数据。&amp;ldquo;用科学实验的思路，代替拍脑袋决策。&lt;/p>
&lt;pre tabindex="0">&lt;code>1. 双方已知：先确认任务目标、已有背景、交付标准和明确边界。信息充分时直接执行，不要重复询问。

2. 我的已知、你的未知：识别可能只存在于我脑中的真实语境、审美偏好、现实限制。若缺失信息会显著改变结果，最多提出 3 个关键问题；若不明确你的合理假设，先完成探索版本。

3. 我的未知、你的已知：主动补充我没考虑到的知识、方法、风险和替代方案。不要局限于我的原始方案，如果我的前提可能错误，请直接指出，并给出更优建议及取舍依据。

4. 双方未知：识别无法仅靠现有信息确定的问题，把它们转化为可验证的假设，设计最小实验，说明要改变的单一变量、成功/失败信号，以及后续需要回收的数据。
&lt;/code>&lt;/pre>&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-cfc47829"
 class="image-zoom-toggle"
 aria-label="放大图片：乔哈里视窗改造的提示词四象限"
 />
 &lt;label
 for="img-cfc47829"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/johari-prompt-framework.png"
 alt="乔哈里视窗改造的提示词四象限"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-cfc47829"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/johari-prompt-framework.png"
 alt="乔哈里视窗改造的提示词四象限"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>乔哈里视窗改造的提示词四象限&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;hr>
&lt;h2 id="四象限法则的跨界启发色彩搭配也是画十字">四象限法则的跨界启发：色彩搭配也是画十字&lt;/h2>
&lt;p>最近在翻一篇讲设计配色的文章（研习设的《十字形配色法》），发现了一个有趣的共鸣。&lt;/p>
&lt;p>很多人面对成千上万种颜色会觉得无从下手。作者的办法极其粗暴：在设计软件的色板里，横向（明度）和纵向（纯度/饱和度）各画一条线，形成一个十字，把颜色分成四个区域。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>区域 1（高明度 + 高纯度）&lt;/strong>：健康、积极、视觉冲击力强。（适合年轻化、促销）&lt;/li>
&lt;li>&lt;strong>区域 2（高明度 + 中低纯度）&lt;/strong>：简洁、干净、清爽、温柔。（适合生活方式、母婴）&lt;/li>
&lt;li>&lt;strong>区域 3（低明度 + 高纯度）&lt;/strong>：强力、商务、有格调、深邃。（适合运动、高端商务）&lt;/li>
&lt;li>&lt;strong>区域 4（低明度 + 低纯度）&lt;/strong>：偏黑灰色调，成熟、神秘、高雅、内敛。（适合奢侈品、艺术展）&lt;/li>
&lt;/ul>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-39341876"
 class="image-zoom-toggle"
 aria-label="放大图片：十字形配色法"
 />
 &lt;label
 for="img-39341876"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/color-cross-method.png"
 alt="十字形配色法"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-39341876"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-ai-anxiety-four-quadrants/color-cross-method.png"
 alt="十字形配色法"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>十字形配色法&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;p>它的核心操作原则只有一条：&lt;strong>选定一个区域后，其他颜色也尽量保持在这个区域内。&lt;/strong> 只要在这个框里选，画面的色调就绝对不会乱。&lt;/p>
&lt;hr>
&lt;h2 id="总结一下">总结一下&lt;/h2>
&lt;p>把 AI 学习、AI 提示词和色彩搭配放在一起看，你会发现一个共通的规律：&lt;/p>
&lt;p>人脑其实很不擅长处理&amp;quot;多维度、无边界&amp;quot;的混沌信息。而四象限的本质，就是&lt;strong>强迫你找出当前问题里最关键的两个变量，画下一个十字。&lt;/strong>&lt;/p>
&lt;p>一旦十字画下，你就有了&amp;quot;拒绝&amp;quot;的底气：&lt;/p>
&lt;ul>
&lt;li>在学 AI 时，你有底气跳过左下角的噪音。&lt;/li>
&lt;li>在写提示词时，你有底气要求 AI 别废话，直接基于假设出方案。&lt;/li>
&lt;li>在选颜色时，你有底气放弃那些虽然好看、但不在当前象限里的干扰项。&lt;/li>
&lt;/ul>
&lt;p>工具和方法永远只是辅助。真正有价值的，是这种&amp;quot;先定边界，再做选择&amp;quot;的克制思维。少即是多，慢即是快。&lt;/p></description></item><item><title>《时光倒流的女孩》读后感</title><link>https://mythstraw.github.io/p/time-backward-girl-reading/</link><pubDate>Mon, 28 Sep 2026 17:00:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/time-backward-girl-reading/</guid><description>&lt;blockquote>
&lt;p>&lt;em>这世上有那么多种生活。我们多么希望自己能够同时体验多种生活，而不是一个一个地去经历。我们多么希望自己能够挑选每一种生活最好的部分，把他们像珍珠一样串起来。可生活不是这样安排的。&lt;strong>人的生命因凌乱而美丽&lt;/strong>。&lt;/em>&lt;/p>&lt;/blockquote>
&lt;p>&lt;a href="https://book.douban.com/subject/26998358/" target="_blank" rel="noopener noreferrer">时光倒流的女孩 (豆瓣)&lt;/a>
&lt;/p>
&lt;p>真的很久没有认真读过一本书了，前段时间因为赵雷《我记得》，听完歌后看到有个公众号的采访说这首歌赵雷的灵感来源是一本叫《时光倒流的女孩》的书。&lt;br>
后来在云音乐的评论下看到赵雷好友浩子的评论，就随口在下面问了一句：这首歌赵雷真的是写一本书的故事吗？没想到浩子回复说：“你猜谁送的”。&lt;br>
所以我更好奇这本书的故事了，然后第一时间买了实体书，一口气读完了这本书，想说说我的了解，全当读后感吧。&lt;/p>
&lt;p>《时光倒流的女孩》的主人公小莉齐15岁时因为一场车祸，离开了人间。当她再次醒来时发现自己正坐在一艘叫“尼罗河号”的船上航行在空旷的尼罗河中，而这艘船的目的地是一个叫“另界”的地方。&lt;/p>
&lt;p>&lt;em>在另界所有的人，从来到这的那一刻开始慢慢的往回长，越变越小，直到回到最初的婴孩的样子，再重新从尼罗河中回到人间&lt;/em>&lt;/p>
&lt;p>这本书写了小莉齐在另界经历的从15-0岁的过程。&lt;br>
在她来到另界的第一天她见到了未曾见过面的外婆，因为外婆离世的早，所以现在的外婆已经非常年轻，很像妈妈，所以小莉齐虽然没见过外婆但依然很亲切。&lt;/p>
&lt;p>虽然有亲人，可是初到另界的小莉齐还是对人间很不舍，每天从特殊的望远镜观察着在人间的爸爸妈妈的情况，还有弟弟以及她最好的朋友的生活，甚至还想着通过海井（可以连接另界和人间）和人间的家人保持联系，后来在另界生活了一段时间后，她有了新的工作，认识了新的朋友和恋人，也渐渐习惯了这里的一切。&lt;/p>
&lt;p>在她倒着长到13岁时她微笑着对外婆说：幸福就是一种选择，如果她不是在15岁来到另界，她可能永远见不到她的外婆，她也不会遇到现在这些朋友。&lt;/p>
&lt;p>虽然这本书的主题是生死与轮回，但是我觉得作者想告诉我们的道理很简单：人生中得到与失去是常态，生活中你做的每一个选择都是有得有失，你会得到一些东西同样也会失去一些东西，所以不用因为每一次得失而烦恼，得到与失去都是一种经历一种生活，人生最精彩的就是未知，如果所有的选择都是好的，生活也挺无趣的不是吗？&lt;/p>
&lt;p>就像书中所说的：&lt;strong>这世上有那么多种生活。我们多么希望自己能够同时体验多种生活，而不是一个一个地去经历。我们多么希望自己能够挑选每一种生活最好的部分，把他们像珍珠一样串起来。可生活不是这样安排的。人的生命因凌乱而美丽&lt;/strong>。&lt;/p>
&lt;p>了解了这本书的故事，再说说赵雷的《我记得》这首歌，读完《时光倒流的女孩》我又仔细听了《我记得》，我的感受是这首歌是赵雷为这个故事写了一个后续。&lt;/p>
&lt;p>&lt;em>这只是我的认知，毕竟同一首歌不同人的感受都会不一样&lt;/em>&lt;/p>
&lt;p>这本书的最后是以小莉齐回到0岁，被放进到尼罗河中重回人间结束的，后面的故事作者没有再写。&lt;/p>
&lt;p>所以读完这本书会很好奇，重回人间又是一个怎样的过程，会发生什么故事？&lt;br>
而这首《我记得》给这个故事作了一个结尾。这首歌是以第一人称写的，所以歌中的我可以是书中的主角小莉齐，也可以是赵雷自己，我更倾向于赵雷把书中的主角想像成了自己，写了一段和母亲的故事。&lt;/p>
&lt;p>整首歌可以分成三个段落，第一段接着书中故事的结束，写的是从另界回到人间新生的过程&lt;/p>
&lt;p>&lt;em>我带着比身体重的行李，游入尼罗河底，经过几道闪电，最后以新生的状态回到了人间，当听到母亲的声音，就知道是她，可母亲已不记得我，或许刚新生的小孩还留有一丝丝另界的记忆，这些记忆伴随在人间的成长，也开始淡忘，所以人们最终总是失忆着相遇。&lt;/em>&lt;/p>
&lt;p>第二段开始写了这一世以及前几世在人间的故事，这一世我们做母子，前几世我们做过朋友，做过叔侄，做过恋人，一次又一次相互送别，然后一次又一次失忆着重聚。&lt;/p>
&lt;p>最后一段，是描写书中小莉齐在另界的故事，可能赵雷联想到自己，想到了已故的母亲，所以在另界我遇到了故去多年的外婆，见到她时她在另界生活了很久已变的很年轻（另界的人都是越来越小），她扎着和母亲一样的马尾，露出和母亲一样的笑。外婆讲了很多关于母亲成长的故事，在这里外婆的思念从未停止。&lt;/p>
&lt;p>最后歌曲的结尾雷子说：&lt;strong>不要哭我最亲爱的人，我最好的玩伴，时空是一个圆圈，直行或是转弯，我们最终都会相见&lt;/strong>，在万家灯火的某一处，人们失忆着相聚。&lt;br>
这或许是在另界的人想对人间亲人想说的话，也许是母亲想对雷子说的话。&lt;/p>
&lt;p>时空是一个圆圈，另界与人间是分开的两个直线，一条从死到重生，一条从生到死，在生与死的转折点上，两个时空交汇成一个圆圈，那些走完直线或半途转弯的人，大家终会失忆着再见的。&lt;/p>
&lt;p>所以这首歌可能也是雷子对自己的和解，他相信在另界的人有自己的生活，一定会生活的很好，不管是在另界的故人还是人间的人，都活好自己就好，直行或是转弯，都是幸福的。&lt;/p>
&lt;p>写的很主观，大家看看就好。&lt;br>
最后借雷子在《家乡》里写给苏菲.珊曼妮的话送给赵雷：愿赵雷知道，我永远爱他和他的音乐。&lt;/p></description></item><item><title>《世界尽头的咖啡馆》分析阅读</title><link>https://mythstraw.github.io/p/worlds-end-cafe-analysis/</link><pubDate>Mon, 28 Sep 2026 16:40:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/worlds-end-cafe-analysis/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>作者&lt;/strong>：约翰·史崔勒基（John Strelecky）&lt;br>
&lt;strong>类别&lt;/strong>：哲学寓言 / 心灵成长小说&lt;br>
&lt;strong>阅读方法&lt;/strong>：分析阅读（基于《如何阅读一本书》）&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="一书籍分类">一、书籍分类&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>书名&lt;/strong>：《世界尽头的咖啡馆》（The Why Café）&lt;/li>
&lt;li>&lt;strong>作者&lt;/strong>：约翰·史崔勒基（John Strelecky），美国作家&lt;/li>
&lt;li>&lt;strong>类别&lt;/strong>：&lt;strong>哲学寓言 / 心灵成长小说&lt;/strong>（虚构叙事 + 存在主义哲学探讨）&lt;/li>
&lt;li>&lt;strong>体裁特征&lt;/strong>：以小说故事为载体，传递人生哲学思考，属于&amp;quot;说理型&amp;quot;作品，但通过叙事而非论证呈现&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="二一句话概括">二、一句话概括&lt;/h2>
&lt;p>一个在人生中迷失方向、疲惫不堪的上班族，因堵车迷路误入一家神秘的&amp;quot;你为什么来这里咖啡馆&amp;quot;，在与女招待凯茜、店主迈克和客人安妮的一夜长谈中，直面三个关于人生本质的问题，最终找到自己&amp;quot;存在的意义&amp;quot;（PFE）并重获生活方向。&lt;/p>
&lt;hr>
&lt;h2 id="三整体架构">三、整体架构&lt;/h2>
&lt;p>全书以&lt;strong>第一人称叙事&lt;/strong>展开，结构清晰：&lt;/p>
&lt;pre tabindex="0">&lt;code>序（作者自述：迷路与咖啡馆的相遇）
├── 01-03 现实困境：堵车、迷路、绝望（人生迷失的隐喻）
├── 04-07 进入咖啡馆：三个问题浮现（你为什么来这里？）
├── 08-10 核心探讨：PFE（存在意义）+ 绿海龟的故事
├── 11-12 渔夫的故事 + 广告与消费陷阱（安妮的循环）
├── 13-14 死亡与满足感 + 金钱观
├── 15-16 运气与指数理论 + 高尔夫球的故事（掌控命运）
├── 17-18 如何寻找答案 + 迈克的哥斯达黎加顿悟
├── 19 离开咖啡馆，带着问题重新出发
尾声（改变后的生活）
&lt;/code>&lt;/pre>&lt;p>&lt;strong>叙事手法&lt;/strong>：以&amp;quot;菜单背面的三个问题&amp;quot;为线索，通过人物对话层层递进，每个故事（绿海龟、渔夫、高尔夫球）都是哲学观点的具象化。&lt;/p>
&lt;hr>
&lt;h2 id="四核心问题">四、核心问题&lt;/h2>
&lt;p>全书围绕三个递进的核心问题展开：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>你为什么来这里？&lt;/strong>（存在的意义是什么？）&lt;/li>
&lt;li>&lt;strong>你害怕死亡吗？&lt;/strong>（是否因虚度人生而恐惧？）&lt;/li>
&lt;li>&lt;strong>你满足吗？&lt;/strong>（当下的生活是否让你满意？）&lt;/li>
&lt;/ol>
&lt;p>这三个问题相互关联，共同指向一个终极追问：&lt;strong>人应该如何度过自己的一生？&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="五关键概念">五、关键概念&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>概念&lt;/th>
 &lt;th>含义&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>PFE&lt;/strong>（Purpose For Existing）&lt;/td>
 &lt;td>存在的意义，一个人活着的根本目标&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>反向浪 / 正向浪&lt;/strong>&lt;/td>
 &lt;td>消耗你精力但与目标无关的事物（反向浪）vs 助你实现目标的事物（正向浪）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>绿海龟法则&lt;/strong>&lt;/td>
 &lt;td>只在顺流时划水，逆流时保存体力——把精力花在正确的事情上&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>消费陷阱循环&lt;/strong>&lt;/td>
 &lt;td>广告制造欲望→购物→缺钱→做不喜欢的工作→更不满足→买更多东西&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>高尔夫球法则&lt;/strong>&lt;/td>
 &lt;td>你可以把球捡起来放到别处打——主动掌控自己的命运&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>指数理论&lt;/strong>&lt;/td>
 &lt;td>分享你的目标，会通过人际网络指数级放大机会&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="六主要论点">六、主要论点&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>大多数人从未认真问过自己&amp;quot;为什么存在&amp;quot;&lt;/strong>，只是机械地遵循社会期待（考学、工作、升职）生活。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>找到 PFE 后，做任何你想做的事去实现它&lt;/strong>——选择权完全在自己手中，不需要他人允许。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>把时间花在与 PFE 无关的事情上，就是浪费生命&lt;/strong>（绿海龟法则：反向浪消耗精力）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>消费主义是陷阱&lt;/strong>：广告让人把幸福寄托在物质上，陷入&amp;quot;工作→购物→更不满足&amp;quot;的恶性循环。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>害怕死亡的本质&lt;/strong>，是害怕&amp;quot;再也没有机会做想做的事&amp;quot;——而如果你每天都在做想做的事，就不会恐惧。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>运气并非偶然&lt;/strong>：为实现 PFE 全力以赴的人，往往&amp;quot;运气好&amp;quot;，因为他们的热情会吸引他人帮助（指数理论）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>答案只能自己寻找&lt;/strong>：没有统一方法，但独处、接触新事物、倾听内心的&amp;quot;共鸣&amp;quot;是常见途径。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>不要等待&amp;quot;退休&amp;quot;&lt;/strong>：每一天都是机会，现在就能做想做的事，不必等到未来。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="七论证分析">七、论证分析&lt;/h2>
&lt;p>本书的论证方式&lt;strong>不是逻辑推演，而是通过故事和对话层层引导&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>绿海龟故事&lt;/strong> → 论证&amp;quot;精力管理&amp;quot;：只在顺流时划水，避免在反向浪上浪费精力&lt;/li>
&lt;li>&lt;strong>渔夫故事&lt;/strong> → 论证&amp;quot;不必等待退休&amp;quot;：渔夫现在就过着商人梦想中的生活&lt;/li>
&lt;li>&lt;strong>安妮的循环&lt;/strong> → 论证&amp;quot;消费陷阱&amp;quot;：广告如何让人陷入恶性循环&lt;/li>
&lt;li>&lt;strong>高尔夫球故事&lt;/strong> → 论证&amp;quot;掌控命运&amp;quot;：你可以主动选择，而非被动接受&lt;/li>
&lt;li>&lt;strong>迈克的哥斯达黎加经历&lt;/strong> → 论证&amp;quot;存在意义的觉醒&amp;quot;：面对自然的宏大，反思自我渺小&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>论证特点&lt;/strong>：每个抽象观点都配一个具体故事，让读者在叙事中&amp;quot;悟&amp;quot;出道理，而非被说服。这种&amp;quot;苏格拉底式对话&amp;quot;（凯茜总是用问题回答问题）强化了读者的主动思考。&lt;/p>
&lt;hr>
&lt;h2 id="八问题解决状况">八、问题解决状况&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>提出的问题&lt;/strong>：人为什么存在？如何找到并实现存在的意义？&lt;/li>
&lt;li>&lt;strong>给出的答案&lt;/strong>：通过独处、接触新事物、倾听内心共鸣来寻找 PFE；找到后做任何想做的事去实现它；把精力花在正向浪上。&lt;/li>
&lt;li>&lt;strong>解决程度&lt;/strong>：&lt;strong>部分解决&lt;/strong>。作者给出了方法论框架（如何找、如何做），但承认&amp;quot;答案只能自己决定&amp;quot;，没有提供普适的、具体的答案——这既是本书的局限，也是其诚实之处。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="九批判性评价">九、批判性评价&lt;/h2>
&lt;h3 id="优点">优点&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>叙事生动&lt;/strong>：用故事承载哲学，可读性强，易于引发共鸣&lt;/li>
&lt;li>&lt;strong>观点清晰&lt;/strong>：PFE、绿海龟、反向浪等概念简洁有力，易于记忆&lt;/li>
&lt;li>&lt;strong>真诚不教条&lt;/strong>：反复强调&amp;quot;答案只能自己找&amp;quot;，不强行灌输&lt;/li>
&lt;/ul>
&lt;h3 id="局限">局限&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>哲学深度有限&lt;/strong>：探讨的是存在主义的基本命题，但未触及尼采、萨特等哲学家的深层思辨，属于&amp;quot;入门级&amp;quot;人生哲学&lt;/li>
&lt;li>&lt;strong>理想化倾向&lt;/strong>：书中&amp;quot;做想做的事就能成功且运气好&amp;quot;的设定过于乐观，忽略了现实中的结构性限制（经济压力、家庭责任、社会约束）&lt;/li>
&lt;li>&lt;strong>叙事巧合过多&lt;/strong>：咖啡馆人物仿佛&amp;quot;全知全能&amp;quot;，总能猜中主角心思，削弱了真实感&lt;/li>
&lt;li>&lt;strong>对&amp;quot;金钱&amp;quot;的讨论略显单薄&lt;/strong>：虽然触及&amp;quot;对金钱的定义会改变&amp;quot;，但未深入探讨现实生存与理想追求的平衡&lt;/li>
&lt;/ul>
&lt;h3 id="价值判断">价值判断&lt;/h3>
&lt;p>作为一本&lt;strong>心灵成长读物&lt;/strong>，它成功唤起了读者对人生意义的思考，具有启发价值；但作为&lt;strong>哲学著作&lt;/strong>，其深度和严谨性有限。适合作为人生思考的&amp;quot;起点&amp;quot;，而非&amp;quot;终点&amp;quot;。&lt;/p>
&lt;hr>
&lt;h2 id="十实践应用">十、实践应用&lt;/h2>
&lt;p>这本书的启示可以这样落地：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>明确你的 PFE&lt;/strong>：花时间独处思考，你真正热爱的是什么？基金分析是手段还是目的？&lt;/li>
&lt;li>&lt;strong>识别反向浪&lt;/strong>：审视每天的时间花在哪里——哪些是消耗精力但与目标无关的&amp;quot;反向浪&amp;quot;（如无意义的刷手机、无效社交）？&lt;/li>
&lt;li>&lt;strong>把精力放在正向浪上&lt;/strong>：把时间投入到与目标一致的事情上（如深入学习投资分析、研究市场）&lt;/li>
&lt;li>&lt;strong>不要等待&amp;quot;退休&amp;quot;&lt;/strong>：现在就开始做想做的事，不必等到&amp;quot;条件成熟&amp;quot;&lt;/li>
&lt;li>&lt;strong>主动掌控命运&lt;/strong>：像&amp;quot;移走高尔夫球&amp;quot;一样，主动选择人生道路，而非被动接受安排&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="一句话总结">一句话总结&lt;/h2>
&lt;blockquote>
&lt;p>这本书用一个温暖的寓言提醒我们——&lt;strong>人生最大的浪费，不是没赚到钱，而是把时间花在了与&amp;quot;你是谁、你为什么存在&amp;quot;无关的事情上。&lt;/strong>&lt;/p>&lt;/blockquote></description></item><item><title>GitHub 部署自己的个人博客网站</title><link>https://mythstraw.github.io/p/github-deploy-personal-blog/</link><pubDate>Sun, 27 Sep 2026 17:50:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/github-deploy-personal-blog/</guid><description>&lt;p>&lt;em>在这个 AI 时代，知识库成了最火的项目。AI 需要知识库来提升专业度，人类需要知识库辅助学习和记忆。但有一个问题是：互联网上有什么是可以永久留存的呢？所有的服务都会随着运营商的倒闭而面临关闭，你用来保存知识库的载体也会随着消失。而目前来看，唯一能够长久存在可能也就只有这个全球最大的仓库 GitHub 了，所以把知识放在 GitHub 上成了很多人的首选方案。&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>想要了解整个详细流程，可以查看 &lt;a href="https://mythstraw.github.io/p/hugo-github-deploy/">使用 Hugo + GitHub 部署博客&lt;/a>
 这个详细的文档。&lt;/p>&lt;/blockquote>
&lt;h2 id="使用的技术">使用的技术&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Hugo&lt;/strong>：静态 blog 网站工具&lt;/li>
&lt;li>&lt;strong>Git&lt;/strong> 工具&lt;/li>
&lt;li>&lt;strong>GitHub&lt;/strong> 仓库&lt;/li>
&lt;li>AI 工具：&lt;strong>nanobot&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Cloudflare&lt;/strong> 部署&lt;/li>
&lt;li>&lt;strong>GitHub 自定义域名&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="简化的流程说明ai-自动操作">简化的流程说明（AI 自动操作）&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>本地环境搭建&lt;/strong>：安装 Hugo 和 Git。&lt;/li>
&lt;li>&lt;strong>创建与配置站点&lt;/strong>：初始化 Hugo 站点，选择并配置主题样式。&lt;/li>
&lt;li>&lt;strong>编写与预览内容&lt;/strong>：用 Markdown 写文章，本地启动服务预览。&lt;/li>
&lt;li>&lt;strong>连接 GitHub 并自动化部署&lt;/strong>：将代码推送到 GitHub，配置 Actions 自动构建和发布。&lt;/li>
&lt;/ol>
&lt;h2 id="修改美化-hugo-blog">修改美化 Hugo Blog&lt;/h2>
&lt;p>先了解一下 Hugo 的整体框架，了解了框架才能知道 AI 改了哪些东西。使用不同的主题，架构可能有一些不同，我们只要了解基础架构，细节就交给 AI 自己去学习。&lt;/p>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-8cf948ce"
 class="image-zoom-toggle"
 aria-label="放大图片：Hugo 站点的目录结构"
 />
 &lt;label
 for="img-8cf948ce"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/hugo-structure.png"
 alt="Hugo 站点的目录结构"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-8cf948ce"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/hugo-structure.png"
 alt="Hugo 站点的目录结构"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>Hugo 站点的目录结构&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;h3 id="-核心内容与模板你需要经常编辑的">📁 核心内容与模板（你需要经常编辑的）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>content/&lt;/code>&lt;/strong>：存放你的博客文章。所有的 Markdown 文件（如 &lt;code>posts/my-first-post.md&lt;/code>）都在这里。&lt;/li>
&lt;li>&lt;strong>&lt;code>layouts/&lt;/code>&lt;/strong>：存放自定义的 HTML 模板。当你需要覆盖主题的页面结构（如修改页脚、首页样式）时，把主题里的文件复制到这里修改。&lt;/li>
&lt;li>&lt;strong>&lt;code>static/&lt;/code>&lt;/strong>：存放不需要 Hugo 处理的静态文件。比如自定义的 CSS、JS、图片、favicon 等，Hugo 会原样复制到最终的 &lt;code>public/&lt;/code> 目录。&lt;/li>
&lt;li>&lt;strong>&lt;code>assets/&lt;/code>&lt;/strong>：存放需要 Hugo 处理（如压缩、编译 SCSS）的文件。通常由主题使用，你也可以在这里放需要打包的 CSS/JS。&lt;/li>
&lt;li>&lt;strong>&lt;code>archetypes/&lt;/code>&lt;/strong>：存放内容模板（原型）。当你执行 &lt;code>hugo new posts/xxx.md&lt;/code> 时，Hugo 会以此处的模板生成文章的初始 Front Matter。&lt;/li>
&lt;li>&lt;strong>&lt;code>data/&lt;/code>&lt;/strong>：存放数据文件（JSON/YAML/TOML），供模板调用，常用于生成列表或配置信息。&lt;/li>
&lt;li>&lt;strong>&lt;code>i18n/&lt;/code>&lt;/strong>：存放多语言翻译文件。如果你的博客是中文，这里可能主要用于覆盖主题的默认语言字符串。&lt;/li>
&lt;/ul>
&lt;h3 id="-hugo-配置与构建自动生成或较少改动">⚙️ Hugo 配置与构建（自动生成或较少改动）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>themes/&lt;/code>&lt;/strong>：存放你安装的 Hugo 主题（如 PaperMod 或 BearNeo）。&lt;strong>建议永远不要直接修改这个文件夹内的文件&lt;/strong>，以免更新主题时被覆盖。&lt;/li>
&lt;li>&lt;strong>&lt;code>hugo.yaml&lt;/code>&lt;/strong>：Hugo 站点的&lt;strong>主配置文件&lt;/strong>。你的站点标题、baseURL、菜单、主题参数都在这里设置。&lt;/li>
&lt;li>&lt;strong>&lt;code>public/&lt;/code>&lt;/strong>：Hugo 构建后生成的&lt;strong>静态网站最终输出目录&lt;/strong>。部署时，GitHub Actions 或 Cloudflare 实际上就是把这里的文件发布出去。&lt;/li>
&lt;li>&lt;strong>&lt;code>resources/&lt;/code>&lt;/strong>：Hugo 的缓存目录。存放图片处理、SCSS 编译等生成的中间文件。&lt;/li>
&lt;li>&lt;strong>&lt;code>.hugo_build.lock&lt;/code>&lt;/strong>：Hugo 构建时的锁文件，防止多个构建任务同时修改文件。通常不需要管它，会自动生成。&lt;/li>
&lt;/ul>
&lt;h3 id="-版本控制与自动化git-相关">🔀 版本控制与自动化（Git 相关）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>.git/&lt;/code>&lt;/strong>：Git 的本地仓库数据。不要手动修改里面的文件。&lt;/li>
&lt;li>&lt;strong>&lt;code>.github/&lt;/code>&lt;/strong>：存放 GitHub Actions 工作流。里面有 &lt;code>workflows/hugo.yaml&lt;/code>，是你推送到 GitHub 后自动部署到 GitHub Pages 的配置文件。&lt;/li>
&lt;li>&lt;strong>&lt;code>.gitignore&lt;/code>&lt;/strong>：告诉 Git 哪些文件和文件夹不需要上传（例如 &lt;code>public/&lt;/code>、&lt;code>resources/&lt;/code>、&lt;code>.hugo_build.lock&lt;/code> 通常会被忽略）。&lt;/li>
&lt;li>&lt;strong>&lt;code>.gitmodules&lt;/code>&lt;/strong>：如果你用 &lt;code>git submodule&lt;/code> 安装了主题，这个文件记录了主题的仓库地址。由于你用了主题，这个文件很重要，需要在部署时用 &lt;code>submodules: recursive&lt;/code> 拉取。&lt;/li>
&lt;/ul>
&lt;h3 id="-部署与托管cloudflare-与-github-pages">☁️ 部署与托管（Cloudflare 与 GitHub Pages）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>.wrangler/&lt;/code>&lt;/strong>：Cloudflare Wrangler CLI 的本地缓存目录。通常不需要手动修改。&lt;/li>
&lt;li>&lt;strong>&lt;code>wrangler.jsonc&lt;/code>&lt;/strong>：Cloudflare Workers 的配置文件。告诉 Cloudflare 项目名称、构建命令（&lt;code>hugo build --gc --minify&lt;/code>）以及静态资源目录（&lt;code>./public&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>&lt;code>CNAME&lt;/code>&lt;/strong>：用于 GitHub Pages 绑定自定义域名的文件（通常包含你的域名）。如果你同时部署到了 Cloudflare 和 GitHub，这个文件会指定 GitHub Pages 的访问域名。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>你只要知道这些文件是干什么的、修改的东西要到哪里去查看就可以了，至于操作的事情交给 AI。&lt;/strong>&lt;/p>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-bcd3441e"
 class="image-zoom-toggle"
 aria-label="放大图片：BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 />
 &lt;label
 for="img-bcd3441e"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/bearneo-nav.png"
 alt="BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-bcd3441e"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/bearneo-nav.png"
 alt="BearNeo 主题里，每一个导航就是一个 Markdown 文档"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>BearNeo 主题里，每一个导航就是一个 Markdown 文档&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;p>我使用的主题是 BearNeo，它是一个极简的主题，每一个导航其实就是一个 MD 文档，你也可以自己去打开文档去编辑内容。&lt;/p>
&lt;p>&lt;figure
 class="image-caption image-zoom-container"
>
 
 &lt;input
 type="checkbox"
 id="img-d2370f3c"
 class="image-zoom-toggle"
 aria-label="放大图片：Hugo 的 HTML 模板文件"
 />
 &lt;label
 for="img-d2370f3c"
 class="image-zoom-label"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/html-template.png"
 alt="Hugo 的 HTML 模板文件"
 loading="lazy"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;label
 for="img-d2370f3c"
 class="image-zoom-overlay"
 >
 &lt;img
 src="https://mythstraw.github.io/img/blog-github-deploy/html-template.png"
 alt="Hugo 的 HTML 模板文件"
 class="zoomable-image"
 />
 &lt;/label>
 
 &lt;figcaption>Hugo 的 HTML 模板文件&lt;/figcaption>
&lt;/figure>
&lt;/p>
&lt;p>&lt;strong>如果想要做很大的样式上的修改，那就需要去改 HTML 模板了，当然你也可以让 AI 去修改。&lt;/strong>&lt;/p>
&lt;h2 id="cloudflare-部署了解一下国内访问有限制">Cloudflare 部署（了解一下，国内访问有限制）&lt;/h2>
&lt;p>Cloudflare 有两种部署方式 pages 和 workers，现在 Cloudflare 开始转向 workers，pages 现在是停止维护但是仍然可以使用的状态。&lt;/p>
&lt;p>这里主要说明 workers 的部署过程。&lt;/p>
&lt;h3 id="选-workers具体设置">选 Workers：具体设置&lt;/h3>
&lt;p>&lt;strong>① 仓库里新增 &lt;code>wrangler.jsonc&lt;/code>&lt;/strong>（这是唯一的仓库改动，AI 会帮你自动完成）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;$schema&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;./node_modules/wrangler/config-schema.json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;foreveryang-blog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;compatibility_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-09-27&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;assets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;directory&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;./public&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;not_found_handling&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;404-page&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>name&lt;/code> 必须和控制台里的 Worker 名&lt;strong>完全一致&lt;/strong>，否则构建直接失败（官方明确警告）。&lt;/li>
&lt;li>&lt;code>compatibility_date&lt;/code> 填你创建那天的日期。&lt;/li>
&lt;li>&lt;code>not_found_handling&lt;/code> 默认是 &lt;code>&amp;quot;none&amp;quot;&lt;/code>（不存在路径只给一句 404）→ 必须写成 &lt;code>&amp;quot;404-page&amp;quot;&lt;/code>，才会用你 &lt;code>404.html&lt;/code> 生成的那个自定义 404 页。&lt;strong>Pages 会自动探测 &lt;code>404.html&lt;/code>，Workers 不会&lt;/strong>，这是从 Pages 思路切过来最容易漏的一项。&lt;/li>
&lt;li>不用写 &lt;code>html_handling&lt;/code>，默认 &lt;code>auto-trailing-slash&lt;/code> 正好适配 Hugo 的 &lt;code>/p/slug/&lt;/code> 这种漂亮 URL。&lt;/li>
&lt;li>纯静态、没有 Worker 脚本 → &lt;strong>不要&lt;/strong>写 &lt;code>&amp;quot;binding&amp;quot;: &amp;quot;ASSETS&amp;quot;&lt;/code>（那是配合 &lt;code>main&lt;/code> 用的）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>② 控制台（Workers &amp;amp; Pages → Create application → Continue with GitHub）&lt;/strong>&lt;/p>
&lt;p>接下来的流程：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Continue with GitHub&lt;/strong> → 弹 GitHub 授权页 → 授权 Cloudflare 的 GitHub App（仓库权限建议选 &lt;code>Only select repositories&lt;/code>，只勾 &lt;code>xxxxxx.github.io&lt;/code>）&lt;/li>
&lt;li>&lt;strong>回到 Cloudflare 选仓库&lt;/strong> → &lt;code>xxxxxx.github.io&lt;/code>&lt;/li>
&lt;li>&lt;strong>Build command&lt;/strong> 填：&lt;/li>
&lt;/ol>
&lt;pre tabindex="0">&lt;code>git submodule update --init --recursive &amp;amp;&amp;amp; hugo --minify --gc ${HUGO_BASEURL:+--baseURL &amp;#34;$HUGO_BASEURL/&amp;#34;}
&lt;/code>&lt;/pre>&lt;ol start="4">
&lt;li>&lt;strong>Advanced settings&lt;/strong> 填：&lt;/li>
&lt;/ol>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>项&lt;/th>
 &lt;th>值&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Root directory&lt;/td>
 &lt;td>留空&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Build variables and secrets&lt;/td>
 &lt;td>&lt;code>HUGO_VERSION&lt;/code> = &lt;code>0.154.5&lt;/code>（&lt;strong>必填&lt;/strong>）；&lt;code>HUGO_BASEURL&lt;/code> = &lt;code>https://foreveryang.xxxxx.workers.dev/&lt;/code>（不知道就先不建）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>API token&lt;/td>
 &lt;td>保持默认（Create new token）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;ol start="5">
&lt;li>&lt;strong>两个开关&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Enable Preview builds&lt;/strong> → 保持默认开启。它只对“非 main 分支”生效，你平时只推 main，不额外耗构建分钟；以后开分支试版式就能拿预览 URL。&lt;/li>
&lt;li>&lt;strong>Protect with Cloudflare Access&lt;/strong> → &lt;strong>必须关&lt;/strong>。这是给内部/私密站点套 Zero Trust 登录的，开了访客要先登录才能看博客。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>③ 点部署后，日志里核对三行&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Hugo 版本 = &lt;code>0.154.5&lt;/code>（证明 &lt;code>HUGO_VERSION&lt;/code> 生效，没退到镜像默认的 &lt;code>0.147.7&lt;/code>）；&lt;/li>
&lt;li>没有 &lt;code>Unable to find theme &amp;quot;hugo-bearneo&amp;quot;&lt;/code>（submodule 拉下来了）；&lt;/li>
&lt;li>末尾 &lt;code>wrangler deploy&lt;/code> 成功，并给出 &lt;code>https://xxxxxxxx.&amp;lt;子域&amp;gt;.workers.dev&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>之后就是把域名发给 AI，让它确认就可以了。Cloudflare 的 workers 域名国内网络访问不了，可以自行使用自定义域名。&lt;/p>
&lt;h2 id="github-怎么自定义域名">GitHub 怎么自定义域名&lt;/h2>
&lt;h3 id="关键顺序别做反">关键顺序（别做反）&lt;/h3>
&lt;p>GitHub 官方明确要求：&lt;strong>先在仓库里填好域名，再去 DNS 加记录&lt;/strong>，反了有子域名被人抢注的风险。&lt;/p>
&lt;p>&lt;strong>① GitHub（先做）&lt;/strong>&lt;/p>
&lt;p>&lt;code>https://github.com/mythstraw/mythstraw.github.io/settings/pages&lt;/code> → Custom domain 填：&lt;/p>
&lt;pre tabindex="0">&lt;code>blog.foreveryang.top
&lt;/code>&lt;/pre>&lt;p>→ Save&lt;/p>
&lt;p>&lt;strong>② 腾讯云 DNSPod（后做）&lt;/strong> 添加记录：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>主机记录&lt;/th>
 &lt;th>记录类型&lt;/th>
 &lt;th>记录值&lt;/th>
 &lt;th>线路&lt;/th>
 &lt;th>TTL&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>blog&lt;/code>&lt;/td>
 &lt;td>&lt;code>CNAME&lt;/code>&lt;/td>
 &lt;td>&lt;code>xxxxxx.github.io&lt;/code>&lt;/td>
 &lt;td>默认&lt;/td>
 &lt;td>600&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>记录值不带仓库名、也不要填 Settings 里那个 &lt;code>*.pages.github.io&lt;/code> 的临时地址。&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>③ 生效后&lt;/strong>（几分钟 ~ 24h）回 Pages 页勾 &lt;strong>Enforce HTTPS&lt;/strong>（证书签发还要几分钟）。&lt;/p>
&lt;p>&lt;strong>④ 让 AI 自行检查去触发一次构建&lt;/strong>：仓库 Actions → &lt;em>Deploy Hugo site to Pages&lt;/em> → Run workflow（或随便 push 一篇文章）。构建时 &lt;code>configure-pages&lt;/code> 会把 baseURL 自动换成新域名，canonical / &lt;code>index.xml&lt;/code> / favicon 就都是 &lt;code>blog.foreveryang.top&lt;/code> 了。&lt;/p></description></item><item><title>使用 Hugo + GitHub 部署博客</title><link>https://mythstraw.github.io/p/hugo-github-deploy/</link><pubDate>Sun, 27 Sep 2026 10:11:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/hugo-github-deploy/</guid><description>&lt;h2 id="一hugo-是什么">一、Hugo 是什么？&lt;/h2>
&lt;p>Hugo 是一个用 Go 语言编写的静态网站生成器（SSG），自 2013 年发布以来，以其&lt;strong>极快的构建速度&lt;/strong>和&lt;strong>简单的部署方式&lt;/strong>在开发者社区中广受欢迎。&lt;/p>
&lt;h3 id="-hugo-的核心优势">⚡ Hugo 的核心优势&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>极致的构建速度&lt;/strong>：这是 Hugo 最突出的标签。由于采用 Go 语言编译，它的构建速度在同类工具中处于领先地位。根据基准测试，构建一个包含 5,000 页的网站，Hugo 仅需约 &lt;strong>2.1 秒&lt;/strong>，而 Jekyll 则需要约 &lt;strong>4 分钟&lt;/strong>。对于内容量大的站点，这个优势会非常明显。&lt;/li>
&lt;li>&lt;strong>简单的部署与零依赖&lt;/strong>：Hugo 以单个二进制文件的形式分发，你下载后即可使用，无需安装 Ruby、Node.js 等运行时环境或处理复杂的依赖关系。这使得它在任何操作系统上的安装和部署都极其简单。&lt;/li>
&lt;li>&lt;strong>内置丰富功能&lt;/strong>：Hugo 自带了许多开箱即用的功能，例如多语言支持、强大的分类系统（Tags/Categories）、图片处理管道以及对 SASS/SCSS 的原生支持，无需依赖外部插件。&lt;/li>
&lt;/ul>
&lt;h3 id="-hugo-的局限性">⚠️ Hugo 的局限性&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>模板系统学习曲线较陡&lt;/strong>：Hugo 使用 Go 语言的 &lt;code>html/template&lt;/code> 语法，对于不熟悉 Go 的开发者来说，其语法和逻辑可能不太直观，相比 Jekyll 的 Liquid 或 Hexo 的 EJS 等模板语言，需要更多的学习时间。&lt;/li>
&lt;li>&lt;strong>缺乏官方插件系统&lt;/strong>：Hugo 没有像 Jekyll 或 Hexo 那样成熟的插件生态系统。虽然可以通过 Shortcodes、主题和 Hugo Modules 进行扩展，但实现高度自定义的功能时，可能不如有插件系统的工具灵活。&lt;/li>
&lt;li>&lt;strong>主题生态相对有限&lt;/strong>：虽然 Hugo 拥有超过 900 个主题，但与 Hexo 等拥有庞大社区和丰富主题数量的工具相比，其主题库在数量和一些特定需求的覆盖上可能稍显不足。&lt;/li>
&lt;/ul>
&lt;h3 id="-与其他主流工具的横向对比">🔍 与其他主流工具的横向对比&lt;/h3>
&lt;p>为了更直观地展示差异，下表汇总了 Hugo 与几款主流 SSG 的核心特性：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>编程语言&lt;/th>
 &lt;th>构建速度&lt;/th>
 &lt;th>学习曲线&lt;/th>
 &lt;th>核心优势&lt;/th>
 &lt;th>最适合场景&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Hugo&lt;/strong>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>&lt;strong>极快&lt;/strong> (毫秒/秒级)&lt;/td>
 &lt;td>中等&lt;/td>
 &lt;td>速度最快、单二进制、零依赖&lt;/td>
 &lt;td>大型站点、内容密集型网站、追求极致性能&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Jekyll&lt;/strong>&lt;/td>
 &lt;td>Ruby&lt;/td>
 &lt;td>较慢 (分钟级)&lt;/td>
 &lt;td>简单&lt;/td>
 &lt;td>GitHub Pages 原生支持、成熟的插件生态&lt;/td>
 &lt;td>简单的博客、GitHub Pages 托管&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Hexo&lt;/strong>&lt;/td>
 &lt;td>Node.js&lt;/td>
 &lt;td>快&lt;/td>
 &lt;td>简单&lt;/td>
 &lt;td>丰富的插件和主题生态、对 JS 开发者友好&lt;/td>
 &lt;td>个人博客、Node.js 技术栈用户&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Gatsby&lt;/strong>&lt;/td>
 &lt;td>JavaScript (React)&lt;/td>
 &lt;td>较慢&lt;/td>
 &lt;td>陡峭&lt;/td>
 &lt;td>强大的 React 组件和 GraphQL 数据层&lt;/td>
 &lt;td>复杂的 React 应用、需要大量动态交互的站点&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Astro&lt;/strong>&lt;/td>
 &lt;td>JavaScript (多框架)&lt;/td>
 &lt;td>快&lt;/td>
 &lt;td>简单&lt;/td>
 &lt;td>默认零 JS、支持多框架组件、内容驱动&lt;/td>
 &lt;td>现代内容网站、电商落地页、追求最小化 JS&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Eleventy&lt;/strong>&lt;/td>
 &lt;td>JavaScript&lt;/td>
 &lt;td>快&lt;/td>
 &lt;td>简单&lt;/td>
 &lt;td>配置灵活、不依赖特定前端框架、对 JS 生态友好&lt;/td>
 &lt;td>偏好 JS 工具链的开发者、注重灵活性的项目&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>综合来看，Hugo 的核心竞争力在于 &lt;strong>“速度”&lt;/strong> 和 &lt;strong>“简洁”&lt;/strong>。它非常适合以下场景：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>内容量大、更新频繁的博客或文档站点&lt;/strong>：构建速度的优势会极大提升开发体验和部署效率。&lt;/li>
&lt;li>&lt;strong>不想深入折腾前端工具链的开发者&lt;/strong>：单二进制文件、零依赖的特性让部署和维护变得非常简单。&lt;/li>
&lt;li>&lt;strong>对网站性能有极致要求的场景&lt;/strong>：Hugo 生成的静态站点本身就非常轻量，配合 CDN 可以轻松获得极快的加载速度。&lt;/li>
&lt;/ul>
&lt;h2 id="二整体部署流程概述简单了解">二、整体部署流程概述（简单了解）&lt;/h2>
&lt;p>使用 Hugo 和 GitHub 部署博客，整个流程可以概括为：&lt;/p>
&lt;p>&lt;strong>在本地用 Hugo 生成静态网站 → 通过 Git 推送到 GitHub 仓库 → 再由 GitHub Actions 自动构建并发布到 GitHub Pages。&lt;/strong>&lt;/p>
&lt;h3 id="-整体流程概览">🧭 整体流程概览&lt;/h3>
&lt;p>整个部署管线大致分为四个阶段：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>本地环境搭建&lt;/strong>：安装 Hugo 和 Git。&lt;/li>
&lt;li>&lt;strong>创建与配置站点&lt;/strong>：初始化 Hugo 站点，选择并配置主题。&lt;/li>
&lt;li>&lt;strong>编写与预览内容&lt;/strong>：用 Markdown 写文章，本地启动服务预览。&lt;/li>
&lt;li>&lt;strong>连接 GitHub 并自动化部署&lt;/strong>：将代码推送到 GitHub，配置 Actions 自动构建和发布。&lt;/li>
&lt;/ol>
&lt;h3 id="-步骤一准备工作与本地搭建">🛠️ 步骤一：准备工作与本地搭建&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>安装必要工具&lt;/strong>&lt;br>
你需要在本地安装 &lt;strong>Hugo&lt;/strong>（建议安装 &lt;strong>extended&lt;/strong> 扩展版，因为许多主题依赖 SCSS 支持）和 &lt;strong>Git&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>macOS&lt;/strong>: &lt;code>brew install hugo&lt;/code>&lt;/li>
&lt;li>&lt;strong>Windows&lt;/strong>: &lt;code>scoop install hugo-extended&lt;/code>&lt;/li>
&lt;li>&lt;strong>Linux&lt;/strong>: &lt;code>sudo snap install hugo&lt;/code> 或 &lt;code>sudo apt install hugo&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>创建 Hugo 站点并初始化 Git&lt;/strong>&lt;br>
在终端中运行以下命令，创建一个名为 &lt;code>my-blog&lt;/code> 的站点，并初始化 Git 仓库：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new site my-blog
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-blog
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>选择并安装主题&lt;/strong>&lt;br>
Hugo 有丰富的主题生态，官方主题库 &lt;a href="https://themes.gohugo.io/" target="_blank" rel="noopener noreferrer">themes.gohugo.io&lt;/a>
 收录了 900+ 个主题，可以按标签、功能、语言筛选，先逛一逛再决定用哪个。中文友好的热门主题包括 &lt;strong>PaperMod&lt;/strong>、&lt;strong>LoveIt&lt;/strong>、&lt;strong>hugo-theme-stack&lt;/strong> 等。以 PaperMod 为例，通过 Git 子模块安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后，在站点配置文件 &lt;code>hugo.toml&lt;/code>（或 &lt;code>config.toml&lt;/code>）中启用主题：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">theme&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;PaperMod&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>基础站点配置&lt;/strong>&lt;br>
编辑 &lt;code>hugo.toml&lt;/code>，至少设置以下关键项：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">baseURL&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;https://你的用户名.github.io/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">languageCode&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;zh-cn&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">title&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;我的博客&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="-步骤二编写内容与本地预览">✍️ 步骤二：编写内容与本地预览&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>创建新文章&lt;/strong>&lt;br>
使用 &lt;code>hugo new&lt;/code> 命令创建文章，它会根据模板自动生成 Front Matter（元数据）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new posts/my-first-post.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>打开生成的文件，将 &lt;code>draft: true&lt;/code> 改为 &lt;code>false&lt;/code>，文章才会被正式发布。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>本地预览&lt;/strong>&lt;br>
启动 Hugo 内置的开发服务器，实时预览效果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>访问 &lt;code>http://localhost:1313/&lt;/code> 即可查看。&lt;code>-D&lt;/code> 参数表示包含草稿文章。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="-步骤三推送到-github-并启用-pages">🚀 步骤三：推送到 GitHub 并启用 Pages&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>创建 GitHub 仓库&lt;/strong>&lt;br>
在 GitHub 上新建一个仓库。&lt;strong>关键点&lt;/strong>：如果你希望博客地址是 &lt;code>https://你的用户名.github.io&lt;/code>，仓库名应设置为 &lt;code>你的用户名.github.io&lt;/code>；如果是项目站点，仓库名可以任意，但地址会多一级子路径。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>推送本地代码&lt;/strong>&lt;br>
在本地仓库中添加远程地址并推送：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git remote add origin https://github.com/你的用户名/仓库名.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Initial commit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push -u origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>启用 GitHub Pages&lt;/strong>&lt;br>
进入仓库的 &lt;strong>Settings &amp;gt; Pages&lt;/strong>，将 &lt;strong>Source&lt;/strong> 从 “Deploy from a branch” 改为 &lt;strong>“GitHub Actions”&lt;/strong>。这个改动是立即生效的，无需保存按钮。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="-步骤四配置-github-actions-自动部署">⚙️ 步骤四：配置 GitHub Actions 自动部署&lt;/h3>
&lt;p>这是实现“推送即部署”的核心。你需要创建一个 GitHub Actions 工作流文件。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>创建工作流文件&lt;/strong>&lt;br>
在站点根目录下创建 &lt;code>.github/workflows/hugo.yaml&lt;/code> 文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置工作流内容&lt;/strong>&lt;br>
将以下官方示例内容粘贴进去（注意根据你的 Hugo 版本和分支名微调）。这个工作流会在你向 &lt;code>main&lt;/code> 分支推送代码时，自动安装 Hugo、构建站点并部署到 GitHub Pages：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy Hugo site to Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">main&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">concurrency&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">group&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cancel-in-progress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">shell&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_VERSION&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.147.9&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install Hugo CLI&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/configure-pages@v5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build with Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_CACHEDIR&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ runner.temp }}/hugo_cache&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_ENVIRONMENT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">production&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> hugo \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --minify \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>推送并触发部署&lt;/strong>&lt;br>
提交这个工作流文件并推送到 GitHub。推送后，GitHub Actions 会自动开始运行。你可以在仓库的 &lt;strong>Actions&lt;/strong> 标签页下查看构建和部署的实时日志。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="-后续写作与发布流程">🔄 后续写作与发布流程&lt;/h3>
&lt;p>完成上述配置后，你日常的写作和发布流程会非常简洁：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>本地写作&lt;/strong>：用 &lt;code>hugo new posts/文章名.md&lt;/code> 创建文章，用 Markdown 编辑。&lt;/li>
&lt;li>&lt;strong>本地预览&lt;/strong>：&lt;code>hugo server -D&lt;/code> 确认效果。&lt;/li>
&lt;li>&lt;strong>一键发布&lt;/strong>：&lt;code>git add . &amp;amp;&amp;amp; git commit -m &amp;quot;更新文章&amp;quot; &amp;amp;&amp;amp; git push&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>推送后，GitHub Actions 会在云端自动完成构建和部署，几分钟后你的博客就会更新。&lt;/p>
&lt;h3 id="-关键提醒">💡 关键提醒&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>baseURL&lt;/code> 配置&lt;/strong>：务必在 &lt;code>hugo.toml&lt;/code> 中正确设置 &lt;code>baseURL&lt;/code>，否则部署后可能出现样式或链接错误。&lt;/li>
&lt;li>&lt;strong>主题更新&lt;/strong>：如果通过 Git 子模块安装主题，在克隆仓库或 Actions 中构建时，需要使用 &lt;code>--recursive&lt;/code> 参数来拉取主题代码，上述工作流示例中已包含 &lt;code>submodules: recursive&lt;/code>。&lt;/li>
&lt;li>&lt;strong>自定义域名&lt;/strong>：如果你绑定了自定义域名，需要在仓库的 Pages 设置中配置，并相应调整 &lt;code>baseURL&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h2 id="三hugo-其他安装方式">三、Hugo 其他安装方式&lt;/h2>
&lt;p>Hugo 还支持免本地安装的构建和部署方式。得益于其“单二进制文件”的设计，你可以将构建过程完全放在云端完成，本地只需要一个浏览器和 Git 即可。&lt;/p>
&lt;h3 id="-方式一利用-github-actions-自动构建">☁️ 方式一：利用 GitHub Actions 自动构建&lt;/h3>
&lt;p>只需要在项目仓库中配置好 GitHub Actions 工作流（如之前封装好的 &lt;code>hugo.yaml&lt;/code>），每次将 Markdown 源文件推送到 GitHub 后，Actions 的虚拟环境会自动安装 Hugo、构建站点并部署到 GitHub Pages。&lt;/p>
&lt;p>&lt;strong>核心配置&lt;/strong>：&lt;br>
在 &lt;code>hugo.yaml&lt;/code> 中，你只需要通过 &lt;code>peaceiris/actions-hugo@v3&lt;/code> 这个 Action 来按需安装指定版本的 Hugo（支持 extended 版本和 Hugo Modules），它会在几秒内完成安装。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">peaceiris/actions-hugo@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;0.147.9&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样，你的本地环境就完全不需要 Hugo，只需负责编写 Markdown 和推送代码。&lt;/p>
&lt;h3 id="-方式二使用-docker-容器">🐳 方式二：使用 Docker 容器&lt;/h3>
&lt;p>如果你需要在本地进行&lt;strong>实时预览&lt;/strong>，但不想直接安装 Hugo 到系统里，Docker 是最佳选择。&lt;/p>
&lt;p>你可以直接运行官方的 Hugo Docker 镜像，将本地项目目录挂载到容器中，即可在容器内执行 &lt;code>hugo server&lt;/code> 命令。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例：使用官方镜像启动本地预览服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run --rm -it &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v &lt;span class="k">$(&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="k">)&lt;/span>:/src &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 1313:1313 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> ghcr.io/gohugoio/hugo:latest server --bind 0.0.0.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方式将 Hugo 的运行环境隔离在容器内，不会污染你的主机系统，同时还能获得完整的本地开发体验。&lt;/p>
&lt;h3 id="-方式三使用云构建服务平台">🚀 方式三：使用云构建服务平台&lt;/h3>
&lt;p>一些静态网站托管平台（如 &lt;strong>Netlify&lt;/strong>、&lt;strong>Vercel&lt;/strong>、&lt;strong>EdgeOne Pages&lt;/strong> 等）内置了对 Hugo 的支持。&lt;/p>
&lt;p>你只需要将 GitHub 仓库连接到这些平台，它们会自动检测到这是一个 Hugo 项目，并在云端完成构建和部署，实现真正的“零配置”持续集成。&lt;/p>
&lt;p>对于“Hugo + GitHub”的博客方案，&lt;strong>使用 GitHub Actions 进行云端构建是最简洁、最一致的路径&lt;/strong>。你的本地角色可以简化为“内容创作者”，只需专注于用 Markdown 写作和 &lt;code>git push&lt;/code> 即可。&lt;/p>
&lt;h2 id="四使用-ai-工具自动部署">四、使用 AI 工具自动部署&lt;/h2>
&lt;p>下面是一个完整的 Skill 技能，整合了 &lt;strong>Hugo 博客部署&lt;/strong> 和 &lt;strong>自定义编辑&lt;/strong> 两大流程。你只需将整个 &lt;code>hugo-blog-manager&lt;/code> 文件夹放入任何 agent 的 &lt;code>skills/&lt;/code> 目录，即可通过自然语言触发。&lt;/p>
&lt;p>我用的是 nanobot，其他 AI 工具一样，&lt;strong>保险起见可以让 AI 对 skill 做一次校验&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h3 id="-目录结构">📁 目录结构&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">skills/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── hugo-blog-manager/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── SKILL.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── scripts/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── _common.ps1 # 公共函数：DryRun 预演、hugo 定位、UTF-8 写文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── check_env.ps1 # 只读环境体检
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── install_hugo.ps1 # 安装 hugo（本地 winget / Docker）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── init_site.ps1 # 新建站点 + git init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── install_theme.ps1 # 装主题并写入 theme:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── preview.ps1 # hugo server 本地预览
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── push_github.ps1 # 提交并推送
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── setup_actions.ps1 # 生成 GitHub Actions 部署 workflow
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>脚本全部是 PowerShell（Windows 原生，不依赖 WSL / Git Bash），并且&lt;strong>每个脚本都带 &lt;code>-DryRun&lt;/code>&lt;/strong>：只打印将要执行的命令，不做任何改动。这就是整个 Skill「确认式执行」的地基——先预演给用户看，用户点头了才实跑。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h3 id="-skillmd">📄 SKILL.md&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name: hugo-blog-manager
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">description: 管理 Hugo 博客：从零创建站点、选装主题、推送 GitHub 并配置 GitHub Actions 自动部署到 GitHub Pages；以及安全地修改现有站点的内容、Front Matter、布局、样式和配置（先给 diff 再逐步确认，hugo server 本地预览，构建或发布失败排错）。当用户说“部署 Hugo 博客”“新建 Hugo 站点”“修改 Hugo 页面”“改页脚”“加关于页”“博客发不出去/Pages 404”或提到 Hugo、GitHub Pages、hugo.yaml 时使用。安装 Hugo 本体必须先让用户在“本地安装 / Docker 安装”之间选择；主题必须在安装那一刻现场询问用户。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">metadata:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nanobot:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> emoji: 📝
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> requires:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> bins: [&amp;#34;git&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># Hugo 博客管理器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">两个工作流：**流程 A 部署新博客**、**流程 B 安全修改现有站点**。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">脚本目录（下文记作 &lt;span class="sb">`$S`&lt;/span>，调用时替换成这个技能的真实路径）：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&lt;/span>$S = &amp;lt;skills&amp;gt;\hugo-blog-manager\scripts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">运行时的当前目录不是技能目录，**调用脚本必须用绝对路径**。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 两条硬性规则
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> &lt;span class="gs">**Hugo 本体安装必须先问用户**&lt;/span>。只能在用户明确选择「本地安装」（winget &lt;span class="sb">`Hugo.Hugo.Extended`&lt;/span>）或「Docker 安装」（拉 hugo 镜像，用 &lt;span class="sb">`docker run`&lt;/span> 跑）之后，才通过 &lt;span class="sb">`install_hugo.ps1`&lt;/span> 执行。不要自动安装，不要替用户选。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> &lt;span class="gs">**主题必须现场问用户**&lt;/span>。本技能不预设任何主题。走到装主题那一步时，先给 3~4 个候选（各自特点 + 仓库地址）让用户挑，选定后才跑 &lt;span class="sb">`install_theme.ps1`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 确认式执行
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">每个关键节点三步走：先跑 &lt;span class="sb">`-DryRun`&lt;/span> → 把命令和影响讲给用户 → 用户明确同意后去掉 &lt;span class="sb">`-DryRun`&lt;/span> 实跑。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 全局前置检查
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```powershell
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&lt;/span>&lt;span class="n">powershell&lt;/span> &lt;span class="n">-NoProfile&lt;/span> &lt;span class="o">-File&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$S&lt;/span>&lt;span class="s2">\check_env.ps1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">只读体检（hugo / git / docker / winget），退出码 &lt;span class="sb">`0`&lt;/span>=就绪、&lt;span class="sb">`1`&lt;/span>=hugo 缺失、&lt;span class="sb">`2`&lt;/span>=git 缺失、&lt;span class="sb">`3`&lt;/span>=两者都缺。hugo 缺失时**不要自己装**，转去问用户选哪种方式：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```powershell
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">&lt;/span>&lt;span class="n">powershell&lt;/span> &lt;span class="n">-NoProfile&lt;/span> &lt;span class="o">-File&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$S&lt;/span>&lt;span class="s2">\install_hugo.ps1&amp;#34;&lt;/span> &lt;span class="n">-Method&lt;/span> &lt;span class="n">Local&lt;/span> &lt;span class="n">-DryRun&lt;/span> &lt;span class="c"># 本地安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">powershell&lt;/span> &lt;span class="n">-NoProfile&lt;/span> &lt;span class="o">-File&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$S&lt;/span>&lt;span class="s2">\install_hugo.ps1&amp;#34;&lt;/span> &lt;span class="n">-Method&lt;/span> &lt;span class="n">Docker&lt;/span> &lt;span class="n">-DryRun&lt;/span> &lt;span class="c"># Docker 安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">```&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">装完重跑 &lt;span class="sb">`check_env.ps1`&lt;/span> 确认；本地安装后若 &lt;span class="sb">`hugo`&lt;/span> 仍不可见，提醒用户新开终端刷新 PATH。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 流程 A：部署新博客
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">按顺序走，每步先 DryRun 再等确认。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> &lt;span class="gs">**环境检查**&lt;/span> —— 见上。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> &lt;span class="gs">**确定站点位置与标题**&lt;/span> —— 问用户博客放哪个目录、叫什么名字（&lt;span class="sb">`baseURL`&lt;/span> 后续可改）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">3.&lt;/span> &lt;span class="gs">**创建站点**&lt;/span>：&lt;span class="sb">`init_site.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -Title &amp;#34;&amp;lt;标题&amp;gt;&amp;#34;`&lt;/span> → &lt;span class="sb">`hugo new site --format yaml`&lt;/span> + &lt;span class="sb">`git init -b main`&lt;/span> + 写 &lt;span class="sb">`hugo.yaml`&lt;/span> 与 &lt;span class="sb">`.gitignore`&lt;/span>。目标目录必须为空，脚本拒绝覆盖已有内容。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">4.&lt;/span> &lt;span class="gs">**选主题（必须先问用户）**&lt;/span>：&lt;span class="sb">`install_theme.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -ThemeName &amp;lt;名&amp;gt; -ThemeRepo &amp;lt;仓库地址&amp;gt;`&lt;/span>。默认走 &lt;span class="sb">`git submodule`&lt;/span>（主题可后续升级）；GitHub 不可达时脚本会报错并提示改用 &lt;span class="sb">`-Mode Zip -ZipUrl &amp;lt;镜像 zip 地址&amp;gt;`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">5.&lt;/span> &lt;span class="gs">**本地预览，交给用户确认**&lt;/span>：&lt;span class="sb">`preview.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span>（&lt;span class="sb">`hugo server`&lt;/span>，默认 http://127.0.0.1:1313/）。这是前台长进程，用后台会话跑；**界面效果必须由用户在浏览器确认**，不要用 HTTP 探测 localhost 代替。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">6.&lt;/span> &lt;span class="gs">**建 GitHub 仓库**&lt;/span>（让用户在网页端建，**不要勾 README / .gitignore**），然后推送：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="sb">`push_github.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -RepoUrl https://github.com/&amp;lt;user&amp;gt;/&amp;lt;repo&amp;gt;.git -Message &amp;#34;Initial commit: Hugo blog&amp;#34;`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">7.&lt;/span> &lt;span class="gs">**配置自动部署**&lt;/span>：&lt;span class="sb">`setup_actions.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span> 写 &lt;span class="sb">`.github/workflows/hugo.yaml`&lt;/span> 并推送。Hugo 版本自动取自本地 hugo 或 hugo 容器，也可 &lt;span class="sb">`-HugoVersion x.y.z`&lt;/span> 指定。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">8.&lt;/span> &lt;span class="gs">**收尾**&lt;/span>：提醒用户去仓库 &lt;span class="sb">`Settings → Pages → Source`&lt;/span> 选 &lt;span class="gs">**GitHub Actions**&lt;/span>（一次性手动步骤），之后每次 push 自动发布。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 流程 B：安全修改现有站点
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> &lt;span class="gs">**先读再动**&lt;/span>。定位改动点：&lt;span class="sb">`hugo.yaml`&lt;/span>（站点配置）、&lt;span class="sb">`content/`&lt;/span>（文章 / Front Matter）、&lt;span class="sb">`layouts/`&lt;/span>（模板覆盖）、&lt;span class="sb">`assets/`&lt;/span> 与 &lt;span class="sb">`static/`&lt;/span>（样式、静态资源）、&lt;span class="sb">`themes/&amp;lt;主题&amp;gt;/`&lt;/span>（主题源码）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> &lt;span class="gs">**主题是外部代码（submodule），默认不改它内部文件**&lt;/span>。优先在站点根目录放同名文件覆盖（Hugo 的 lookup order），例如 &lt;span class="sb">`layouts/partials/footer.html`&lt;/span>。确实必须改主题内部时，先说明代价（升级会被覆盖，或需要 fork）再决定。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">3.&lt;/span> &lt;span class="gs">**每处改动都是三步**&lt;/span>：读原文 → 把 diff（改什么、为什么、影响哪些页面）给用户看 → 等确认 → 再改。一次只改一处，别攒一堆一起改。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">4.&lt;/span> &lt;span class="gs">**改完必看**&lt;/span>：&lt;span class="sb">`preview.ps1`&lt;/span> 让用户在浏览器确认效果；改模板时可用 &lt;span class="sb">`-Drafts`&lt;/span> 连草稿一起看。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">5.&lt;/span> &lt;span class="gs">**用户认可后再提交**&lt;/span>：&lt;span class="sb">`push_github.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -RepoUrl &amp;lt;origin&amp;gt; -Message &amp;#34;&amp;lt;改了什么&amp;gt;&amp;#34;`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">6.&lt;/span> &lt;span class="gs">**不可逆操作先备份**&lt;/span>：删内容、换主题、改 &lt;span class="sb">`baseURL`&lt;/span>、重写 git 历史之前，先复制目录或开新分支。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### 常见排错
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Pages 404 / 页面不更新**：仓库 &lt;span class="sb">`Settings → Pages → Source`&lt;/span> 必须是 &lt;span class="sb">`GitHub Actions`&lt;/span>；&lt;span class="sb">`baseURL`&lt;/span> 与实际域名不一致时由 workflow 的 &lt;span class="sb">`--baseURL`&lt;/span> 兜底。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **样式没生效**：核对主题的 &lt;span class="sb">`assets`&lt;/span> / &lt;span class="sb">`static`&lt;/span> 目录结构，以及 &lt;span class="sb">`hugo.yaml`&lt;/span> 里的 &lt;span class="sb">`theme`&lt;/span> 值与 &lt;span class="sb">`themes/`&lt;/span> 下的目录名是否一致。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **构建失败**：看 Actions 日志；本地 hugo 版本与主题要求不匹配时，用 &lt;span class="sb">`setup_actions.ps1 -HugoVersion`&lt;/span> 重新生成 workflow。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **CI 里主题目录是空的**：workflow 的 checkout 已带 &lt;span class="sb">`submodules: recursive`&lt;/span>；若仍为空，确认 &lt;span class="sb">`.gitmodules`&lt;/span> 已提交进仓库。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **用户站点仓库（&lt;span class="sb">`&amp;lt;user&amp;gt;.github.io`&lt;/span>）**：&lt;span class="sb">`baseURL`&lt;/span> 必须是根域名（如 &lt;span class="sb">`https://mythstraw.github.io/`&lt;/span>）；私有仓库开 Pages 需付费，必须 public。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Hugo 陷阱速查
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> &lt;span class="sb">`T`&lt;/span> / &lt;span class="sb">`i18n`&lt;/span> 返回值会被 HTML 转义 → 翻译串含 &lt;span class="sb">`&amp;lt;a&amp;gt;`&lt;/span> 时必须 &lt;span class="sb">`| safeHTML`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 模板内链接用 &lt;span class="sb">`.RelPermalink`&lt;/span>；&lt;span class="sb">`relURL`&lt;/span> 在带语言前缀时会重复加前缀。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 首页 &lt;span class="sb">`.Title`&lt;/span> 为空 → 判断首页必须用 &lt;span class="sb">`.IsHome`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> front matter 不写 &lt;span class="sb">`slug`&lt;/span> 时 Hugo 用**标题**做 URL（中文标题 → 百分号编码）→ 每篇显式写 &lt;span class="sb">`slug`&lt;/span>。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> &lt;span class="sb">`buildFuture=false`&lt;/span>（默认）：&lt;span class="sb">`date`&lt;/span> 写成未来时间会被整篇跳过。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 用 Docker 跑 hugo 必须把站点子目录挂成工作目录（挂整盘会报 &amp;#34;Unable to locate config file&amp;#34;）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 脚本清单
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| 脚本 | 作用 | 关键参数 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| --- | --- | --- |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`check_env.ps1`&lt;/span> | 只读环境体检 | &lt;span class="sb">`-Json`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`install_hugo.ps1`&lt;/span> | 安装 hugo（**须用户先选方式**） | &lt;span class="sb">`-Method Local\|Docker`&lt;/span>、&lt;span class="sb">`-StartEngine`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`init_site.ps1`&lt;/span> | 新建站点 + git init + 配置 + .gitignore | &lt;span class="sb">`-SitePath`&lt;/span>、&lt;span class="sb">`-Title`&lt;/span>、&lt;span class="sb">`-BaseUrl`&lt;/span>、&lt;span class="sb">`-LanguageCode`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`install_theme.ps1`&lt;/span> | 装主题并写入 &lt;span class="sb">`theme:`&lt;/span>（**主题须现场问用户**） | &lt;span class="sb">`-ThemeName`&lt;/span>、&lt;span class="sb">`-ThemeRepo`&lt;/span>、&lt;span class="sb">`-Mode Submodule\|Zip`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`preview.ps1`&lt;/span> | &lt;span class="sb">`hugo server`&lt;/span> 本地预览 | &lt;span class="sb">`-Port`&lt;/span>、&lt;span class="sb">`-Drafts`&lt;/span>、&lt;span class="sb">`-BindAddress`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`push_github.ps1`&lt;/span> | 提交并推送到 GitHub | &lt;span class="sb">`-RepoUrl`&lt;/span>、&lt;span class="sb">`-Branch`&lt;/span>、&lt;span class="sb">`-Message`&lt;/span>、&lt;span class="sb">`-Rebase`&lt;/span> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| &lt;span class="sb">`setup_actions.ps1`&lt;/span> | 生成 GitHub Actions 部署 workflow | &lt;span class="sb">`-HugoVersion`&lt;/span>、&lt;span class="sb">`-Branch`&lt;/span>、&lt;span class="sb">`-NoPush`&lt;/span> |
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="-脚本关键片段">🔧 脚本关键片段&lt;/h3>
&lt;p>为控制篇幅，下面是各脚本的关键部分（真代码节选，&lt;code># ...&lt;/code> 表示省略；完整脚本见文末下载）。&lt;/p>
&lt;h4 id="scripts_commonps1">&lt;code>scripts/_common.ps1&lt;/code>&lt;/h4>
&lt;p>这段是整个技能的核心：&lt;strong>本机装了 hugo 就直接跑，没装但 Docker 引擎在跑就用容器跑&lt;/strong>——两种安装方式共用同一套脚本。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 有原生 hugo 就原生跑；没有原生 hugo 但 Docker 引擎在跑，就用容器跑&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">Invoke-Hugo&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="nb">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="na">Mandatory&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">$true&lt;/span>&lt;span class="p">)][&lt;/span>&lt;span class="no">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$SitePath&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="nb">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="na">Mandatory&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">$true&lt;/span>&lt;span class="p">)][&lt;/span>&lt;span class="no">string[]&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$HugoArgs&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$MountPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$Image&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;hugomods/hugo:exts&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">string[]&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$ExtraDockerArgs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">switch&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="nv">$DryRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$status&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;native&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$line&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;cd &amp;#34;{0}&amp;#34;; hugo {1}&amp;#39;&lt;/span> &lt;span class="o">-f&lt;/span> &lt;span class="nv">$SitePath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$HugoArgs&lt;/span> &lt;span class="n">-join&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$DryRun&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;DRY-RUN: &lt;/span>&lt;span class="nv">$line&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># ... 实跑，退出码非 0 就抛错&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;docker&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$mount&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$MountPath&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="nv">$mount&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$mount&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$SitePath&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$src&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-PosixPath&lt;/span> &lt;span class="nv">$mount&lt;/span> &lt;span class="c"># E:\myblog -&amp;gt; /e/myblog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$dkArgs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;run&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--rm&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$ExtraDockerArgs&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-v&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">${src}&lt;/span>&lt;span class="s2">:/src&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;/src&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Image&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;hugo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$HugoArgs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$DryRun&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;DRY-RUN: docker &amp;#39;&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$dkArgs&lt;/span> &lt;span class="n">-join&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># ... 实跑，退出码非 0 就抛错&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">throw&lt;/span> &lt;span class="s2">&amp;#34;hugo is not available: neither a native &amp;#39;hugo&amp;#39; executable nor a running Docker engine was found. Run install_hugo.ps1 first (ask the user to choose Local or Docker).&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptscheck_envps1">&lt;code>scripts/check_env.ps1&lt;/code>&lt;/h4>
&lt;p>只读体检，靠&lt;strong>退出码&lt;/strong>把结论告诉 agent：&lt;code>0&lt;/code>=就绪、&lt;code>1&lt;/code>=hugo 缺失、&lt;code>2&lt;/code>=git 缺失、&lt;code>3&lt;/code>=两者都缺。缺 hugo 时打印的是「去问用户选哪种方式」，而不是自己去装。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$hugo&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoStatus&lt;/span> &lt;span class="c"># native / docker / none&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$git&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-GitExe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$docker&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Test-DockerEngine&lt;/span> &lt;span class="c"># client / engine / version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$missing&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$hugo&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$missing&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s1">&amp;#39;hugo&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="nv">$git&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$missing&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s1">&amp;#39;git&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># exit code: 0 ready, 1 hugo missing, 2 git missing, 3 both missing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$exitCode&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$missing&lt;/span> &lt;span class="o">-contains&lt;/span> &lt;span class="s1">&amp;#39;hugo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$exitCode&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="mf">1&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$missing&lt;/span> &lt;span class="o">-contains&lt;/span> &lt;span class="s1">&amp;#39;git&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$exitCode&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="mf">2&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$missing&lt;/span> &lt;span class="o">-contains&lt;/span> &lt;span class="s1">&amp;#39;hugo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s1">&amp;#39;NEXT: hugo is missing. Do NOT install silently - ask the user to pick one:&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s1">&amp;#39; A) local install : powershell -NoProfile -File install_hugo.ps1 -Method Local (winget Hugo.Hugo.Extended)&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s1">&amp;#39; B) docker install : powershell -NoProfile -File install_hugo.ps1 -Method Docker (needs Docker Desktop running)&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptsinstall_hugops1">&lt;code>scripts/install_hugo.ps1&lt;/code>&lt;/h4>
&lt;p>两种安装方式（&lt;code>-Method Local|Docker&lt;/code>），都要求用户先表态。装完自己复检一次，而不是假设成功。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$Method&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;Local&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$wgArgs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;install&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--id&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$WingetId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-e&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--accept-source-agreements&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--accept-package-agreements&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$DryRun&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;DRY-RUN: {0} {1}&amp;#39;&lt;/span> &lt;span class="o">-f&lt;/span> &lt;span class="nv">$winget&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$wgArgs&lt;/span> &lt;span class="n">-join&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="n">exit&lt;/span> &lt;span class="mf">0&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$winget&lt;/span> &lt;span class="nv">@wgArgs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$after&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$after&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;native&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;OK: hugo {0} -&amp;gt; {1}&amp;#34;&lt;/span> &lt;span class="o">-f&lt;/span> &lt;span class="nv">$after&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Version&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$after&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Exe&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="n">exit&lt;/span> &lt;span class="mf">0&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># ... 仍不可见时给出提示（下载被墙、需刷新 PATH、或改用 Docker）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Docker 方式：引擎没起时可加 -StartEngine，最多等 240 秒&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$docker&lt;/span> &lt;span class="n">pull&lt;/span> &lt;span class="nv">$Image&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$docker&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-rm&lt;/span> &lt;span class="nv">$Image&lt;/span> &lt;span class="n">hugo&lt;/span> &lt;span class="n">version&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptsinit_siteps1">&lt;code>scripts/init_site.ps1&lt;/code>&lt;/h4>
&lt;p>新建站点前的唯一硬校验：&lt;strong>目标目录必须是空的&lt;/strong>，宁可报错也不碰已有内容。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="n">-LiteralPath&lt;/span> &lt;span class="nv">$sitePath&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$entries&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-LiteralPath&lt;/span> &lt;span class="nv">$sitePath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Where-Object&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Name&lt;/span> &lt;span class="o">-ne&lt;/span> &lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$entries&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Count&lt;/span> &lt;span class="o">-gt&lt;/span> &lt;span class="mf">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Fail&lt;/span> &lt;span class="s2">&amp;#34;Target directory is not empty: &lt;/span>&lt;span class="nv">$sitePath&lt;/span>&lt;span class="s2">. Pick another path, or clean it up first (refusing to touch existing content).&amp;#34;&lt;/span> &lt;span class="mf">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Invoke-Hugo&lt;/span> &lt;span class="n">-SitePath&lt;/span> &lt;span class="nv">$parent&lt;/span> &lt;span class="n">-MountPath&lt;/span> &lt;span class="nv">$parent&lt;/span> &lt;span class="n">-Image&lt;/span> &lt;span class="nv">$Image&lt;/span> &lt;span class="n">-DryRun:&lt;/span>&lt;span class="nv">$DryRun&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-HugoArgs&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;new&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;site&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$leaf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--format&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;yaml&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 新站点没有需要保留的内容，直接写一份干净的 hugo.yaml（theme: 留到装主题那步再写）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$config&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="sh">@&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">baseURL: &amp;#34;&lt;/span>&lt;span class="nv">$BaseUrl&lt;/span>&lt;span class="sh">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">languageCode: &amp;#34;&lt;/span>&lt;span class="nv">$LanguageCode&lt;/span>&lt;span class="sh">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">title: &amp;#34;&lt;/span>&lt;span class="nv">$Title&lt;/span>&lt;span class="sh">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;#34;@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Utf8File&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$configPath&lt;/span> &lt;span class="n">-Content&lt;/span> &lt;span class="nv">$config&lt;/span> &lt;span class="c"># UTF-8 无 BOM，避免中文标题乱码&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptsinstall_themeps1">&lt;code>scripts/install_theme.ps1&lt;/code>&lt;/h4>
&lt;p>默认 &lt;code>git submodule&lt;/code>（主题可后续升级）；&lt;code>github.com&lt;/code> 不可达时不硬顶，改走 &lt;code>-Mode Zip&lt;/code> 从镜像下载。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 先探活：不通就明确告诉用户「加速器没开」或「改用 -Mode Zip」&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$probe&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$git&lt;/span> &lt;span class="nb">ls-remote&lt;/span> &lt;span class="nv">$ThemeRepo&lt;/span> &lt;span class="n">HEAD&lt;/span> &lt;span class="mf">2&lt;/span>&lt;span class="p">&amp;gt;&amp;amp;&lt;/span>&lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$LASTEXITCODE&lt;/span> &lt;span class="o">-ne&lt;/span> &lt;span class="mf">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Fail&lt;/span> &lt;span class="s2">&amp;#34;Cannot reach &lt;/span>&lt;span class="nv">$ThemeRepo&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="mf">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$git&lt;/span> &lt;span class="n">-C&lt;/span> &lt;span class="nv">$sitePath&lt;/span> &lt;span class="n">submodule&lt;/span> &lt;span class="n">add&lt;/span> &lt;span class="nv">$ThemeRepo&lt;/span> &lt;span class="s2">&amp;#34;themes/&lt;/span>&lt;span class="nv">$ThemeName&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nv">$git&lt;/span> &lt;span class="n">-C&lt;/span> &lt;span class="nv">$sitePath&lt;/span> &lt;span class="n">submodule&lt;/span> &lt;span class="n">update&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-init&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-recursive&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># -Mode Zip 分支：下载 + 解压到 themes/&amp;lt;名&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Invoke-WebRequest&lt;/span> &lt;span class="n">-Uri&lt;/span> &lt;span class="nv">$ZipUrl&lt;/span> &lt;span class="n">-OutFile&lt;/span> &lt;span class="nv">$tmpZip&lt;/span> &lt;span class="n">-UseBasicParsing&lt;/span> &lt;span class="n">-TimeoutSec&lt;/span> &lt;span class="mf">300&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Expand-Archive&lt;/span> &lt;span class="n">-LiteralPath&lt;/span> &lt;span class="nv">$tmpZip&lt;/span> &lt;span class="n">-DestinationPath&lt;/span> &lt;span class="nv">$tmpDir&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 把 theme: 写进配置（已有就替换，没有就追加）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$content&lt;/span> &lt;span class="o">-match&lt;/span> &lt;span class="s1">&amp;#39;(?m)^\s*theme\s*[:=]&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$newContent&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">regex&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">Replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$content&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;(?m)^\s*theme\s*[:=].*$&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$line&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Utf8File&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$configPath&lt;/span> &lt;span class="n">-Content&lt;/span> &lt;span class="nv">$newContent&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptspreviewps1">&lt;code>scripts/preview.ps1&lt;/code>&lt;/h4>
&lt;p>本地预览。Docker 模式下有个坑：容器内得监听 &lt;code>0.0.0.0&lt;/code>，端口只发布到宿主机回环地址，否则外面打不开。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$status&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Fail&lt;/span> &lt;span class="s2">&amp;#34;hugo is not available. Run check_env.ps1, then ask the user to choose Local or Docker install.&amp;#34;&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 容器模式：容器内监听 0.0.0.0，端口发布在宿主机回环地址上&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$innerBind&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$BindAddress&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$extra&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;docker&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$innerBind&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;0.0.0.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$extra&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-p&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;{0}:{1}:{1}&amp;#34;&lt;/span> &lt;span class="o">-f&lt;/span> &lt;span class="nv">$BindAddress&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Port&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$hugoArgs&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;server&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--port&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$Port&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--bind&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$innerBind&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$Drafts&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$hugoArgs&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s1">&amp;#39;-D&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptspush_githubps1">&lt;code>scripts/push_github.ps1&lt;/code>&lt;/h4>
&lt;p>三道保险：身份没配不提交、工作区干净不算失败、远端已有提交时&lt;strong>默认中止&lt;/strong>（要显式加 &lt;code>-Rebase&lt;/code>）。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1) git 身份没配就中止，绝不以未知作者提交&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="nv">$email&lt;/span> &lt;span class="o">-or&lt;/span> &lt;span class="o">-not&lt;/span> &lt;span class="nv">$name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Fail&lt;/span> &lt;span class="s1">&amp;#39;git user.name / user.email are not configured. Ask the user for them and re-run with -GitUserName / -GitUserEmail.&amp;#39;&lt;/span> &lt;span class="mf">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2) 工作区干净就跳过 commit（不是报错）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$status&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&amp;amp;&lt;/span> &lt;span class="nv">$git&lt;/span> &lt;span class="n">-C&lt;/span> &lt;span class="nv">$sitePath&lt;/span> &lt;span class="n">status&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-porcelain&lt;/span> &lt;span class="mf">2&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="vm">$null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Invoke-Git&lt;/span> &lt;span class="n">-GitArgs&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$sitePath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;add&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-A&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Invoke-Git&lt;/span> &lt;span class="n">-GitArgs&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$sitePath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;commit&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-m&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Message&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3) 远端已有提交时中止，除非显式 -Rebase&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$remoteHeads&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&amp;amp;&lt;/span> &lt;span class="nv">$git&lt;/span> &lt;span class="nb">ls-remote&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-heads&lt;/span> &lt;span class="n">origin&lt;/span> &lt;span class="nv">$Branch&lt;/span> &lt;span class="mf">2&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="vm">$null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$remoteHeads&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$LASTEXITCODE&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="mf">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="nv">$Rebase&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Fail&lt;/span> &lt;span class="s2">&amp;#34;Remote is not empty. Re-run with -Rebase to pull remote commits first, or push to another repo/branch.&amp;#34;&lt;/span> &lt;span class="mf">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Invoke-Git&lt;/span> &lt;span class="n">-GitArgs&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$sitePath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;pull&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--rebase&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;origin&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Branch&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Invoke-Git&lt;/span> &lt;span class="n">-GitArgs&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;-C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$sitePath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;push&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-u&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;origin&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Branch&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-AllowFail&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="scriptssetup_actionsps1">&lt;code>scripts/setup_actions.ps1&lt;/code>&lt;/h4>
&lt;p>Hugo 版本不写死：优先用 &lt;code>-HugoVersion&lt;/code>，否则从本地 hugo 或 hugo 容器里探测，保证 CI 用和你本地一致的版本。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span> &lt;span class="nv">$HugoVersion&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$status&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoStatus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;native&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$HugoVersion&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoVersionFromString&lt;/span> &lt;span class="n">-Text&lt;/span> &lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elseif&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Mode&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s1">&amp;#39;docker&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$raw&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&amp;amp;&lt;/span> &lt;span class="nv">$status&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Exe&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-rm&lt;/span> &lt;span class="nv">$Image&lt;/span> &lt;span class="n">hugo&lt;/span> &lt;span class="n">version&lt;/span> &lt;span class="mf">2&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="vm">$null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-join&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$HugoVersion&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-HugoVersionFromString&lt;/span> &lt;span class="n">-Text&lt;/span> &lt;span class="nv">$raw&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 模板里占位，再替换成真实版本号与分支，UTF-8 无 BOM 写出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$workflow&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$template&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;__HUGO_VERSION__&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$HugoVersion&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">Replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;__BRANCH__&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$Branch&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Utf8File&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$workflowPath&lt;/span> &lt;span class="n">-Content&lt;/span> &lt;span class="nv">$workflow&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 交给 push_github.ps1 提交推送（复用同一套身份/远端/分支保护）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Join-Path&lt;/span> &lt;span class="nv">$PSScriptRoot&lt;/span> &lt;span class="s1">&amp;#39;push_github.ps1&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">-SitePath&lt;/span> &lt;span class="nv">$sitePath&lt;/span> &lt;span class="n">-RepoUrl&lt;/span> &lt;span class="nv">$remote&lt;/span> &lt;span class="n">-Message&lt;/span> &lt;span class="nv">$Message&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="-使用方式">🚀 使用方式&lt;/h3>
&lt;ol>
&lt;li>解压后把整个 &lt;code>hugo-blog-manager&lt;/code> 文件夹放进 nanobot 工作区的 &lt;code>skills/&lt;/code> 目录（Windows 下不用 &lt;code>chmod&lt;/code>，PowerShell 脚本直接就能跑）。&lt;/li>
&lt;li>对 nanobot 说：
&lt;ul>
&lt;li>&lt;strong>部署新博客&lt;/strong>：“部署 Hugo 博客”&lt;/li>
&lt;li>&lt;strong>修改现有博客&lt;/strong>：“修改 Hugo 页脚”、“添加关于页面”等&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>nanobot 会自动加载 Skill，按对应流程逐步询问并执行——每个节点都是「先 &lt;code>-DryRun&lt;/code> 给你看命令 → 你确认 → 才真正执行」。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="-下载这个-skill">📦 下载这个 Skill&lt;/h3>
&lt;p>上面第四节贴的只是节选，完整脚本（7 个脚本 + 公共函数，含全部边界检查、退出码与排错提示）打包在这里：&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://mythstraw.github.io/downloads/hugo-blog-manager.zip">⬇️ 下载 hugo-blog-manager.zip&lt;/a>
&lt;/strong>&lt;/p>
&lt;p>下载后解压，把整个 &lt;code>hugo-blog-manager&lt;/code> 文件夹放进 nanobot 工作区的 &lt;code>skills/&lt;/code> 目录，重启会话即可自动加载。&lt;/p>
&lt;hr>
&lt;blockquote>
&lt;p>📄 &lt;strong>延伸阅读&lt;/strong>：这篇讲的是「为什么这么搭」——Hugo 是什么、和其它静态站点生成器的差别、Actions 自动部署的原理。另一篇 &lt;a href="https://mythstraw.github.io/p/github-deploy-personal-blog/">《GitHub 部署自己的个人博客网站》&lt;/a>
 是一份更完整的实操记录：从建仓库、配 Actions 到绑定自定义域名，可以对照着看。&lt;/p>&lt;/blockquote></description></item><item><title>第一篇文章：博客开张</title><link>https://mythstraw.github.io/p/hello-world/</link><pubDate>Sun, 27 Sep 2026 00:45:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/p/hello-world/</guid><description>&lt;p>博客搭起来了 🎉&lt;/p>
&lt;h2 id="这个站点用什么搭的">这个站点用什么搭的&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Hugo&lt;/strong>（extended 版）+ &lt;strong>hugo-bearneo&lt;/strong> 主题，构建速度极快，页面很轻&lt;/li>
&lt;li>内容用 Markdown 写，放在 &lt;code>content/blog/&lt;/code> 目录&lt;/li>
&lt;li>主题固件是 submodule，升级用 &lt;code>git submodule update --remote&lt;/code>&lt;/li>
&lt;li>推送到 GitHub 后由 GitHub Actions 自动构建并发布到 GitHub Pages&lt;/li>
&lt;/ul>
&lt;h2 id="怎么写新文章">怎么写新文章&lt;/h2>
&lt;p>在站点根目录执行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new content blog/文章文件名.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者直接复制本文件的表头（front matter），改 &lt;code>title&lt;/code> / &lt;code>date&lt;/code> / &lt;code>tags&lt;/code> 即可。&lt;/p>
&lt;p>Front matter 里常用字段：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>字段&lt;/th>
 &lt;th>作用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>title&lt;/code>&lt;/td>
 &lt;td>文章标题&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>date&lt;/code>&lt;/td>
 &lt;td>发布时间（决定排序；写未来时间会当天不显示）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>slug&lt;/code>&lt;/td>
 &lt;td>文章 URL 末段，例如 &lt;code>/p/hello-world/&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>description&lt;/code>&lt;/td>
 &lt;td>摘要，用于列表页和搜索引擎&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tags&lt;/code>&lt;/td>
 &lt;td>标签数组&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>draft: true&lt;/code>&lt;/td>
 &lt;td>标记为草稿，默认不发布&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mermaid: true&lt;/code>&lt;/td>
 &lt;td>允许本文使用 Mermaid 图表&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>&amp;lt;!--more--&amp;gt;&lt;/code> 之前的内容会作为列表页的摘要。&lt;/p>
&lt;h2 id="已开启的功能">已开启的功能&lt;/h2>
&lt;p>按年份分组的文章列表、标题搜索、文章目录、图片点击放大、外链新窗口打开。&lt;/p>
&lt;hr>
&lt;p>这篇文章可以删掉，或者留着当模板用。&lt;/p></description></item><item><title>工具推荐</title><link>https://mythstraw.github.io/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/projects/</guid><description>&lt;h1 id="工具推荐">工具推荐&lt;/h1>
&lt;div class="page-card">
&lt;p>这里主要推荐一些好用的 AI 小工具，都是我自己在用或者在折腾的，陆续补充。&lt;/p>
&lt;/div>
&lt;h3 id="网页工具">网页工具&lt;/h3>
&lt;div class="page-card">
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://topbook.cc/tools/cornell-notes-paper" target="_blank" rel="noopener noreferrer">随心打印&lt;/a>
&lt;/strong> —— 康奈尔笔记纸在线生成，选好版式直接打印，随手就能用。&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://koukoukou.cn/local" target="_blank" rel="noopener noreferrer">免费抠图&lt;/a>
&lt;/strong> —— 在线一键抠图，图片本地处理，不用担心素材外传。&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.iloveimg.com/zh-cn" target="_blank" rel="noopener noreferrer">iLoveIMG&lt;/a>
&lt;/strong> —— 图片在线编辑工具集&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://tinywow.com/" target="_blank" rel="noopener noreferrer">TinyWow&lt;/a>
&lt;/strong> —— 免费在线小工具的合集：PDF、图片、视频、文字处理。&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://freecompress.com/zh-cn" target="_blank" rel="noopener noreferrer">压缩工具&lt;/a>
&lt;/strong> —— 在线压缩图片、视频、PDF，不用装软件。&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.wxbooks.com/" target="_blank" rel="noopener noreferrer">Wx-Library电子书&lt;/a>
&lt;/strong> —— 电子书网站&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.ilovepdf.com/" target="_blank" rel="noopener noreferrer">iLovePDF&lt;/a>
&lt;/strong> —— PDF爱好者的在线工具集&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://tools.pdf24.org/zh/" target="_blank" rel="noopener noreferrer">PDF24 Tools&lt;/a>
&lt;/strong> —— 解决所有PDF问题的免费PDF工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.46.la/" target="_blank" rel="noopener noreferrer">懒人工具箱&lt;/a>
&lt;/strong> —— 超全的工具网站，日常处理、开发调试&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.ysdaima.com/" target="_blank" rel="noopener noreferrer">全能颜色工具&lt;/a>
&lt;/strong> —— AI配色、图像处理、代码转换、数据可视化&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://friendswrap.com/" target="_blank" rel="noopener noreferrer">包装纸工具&lt;/a>
&lt;/strong> —— 把照片变成包装纸的工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://reader.jandan.net/#features" target="_blank" rel="noopener noreferrer">煎蛋阅读器&lt;/a>
&lt;/strong> —— 网页版电子书阅读器，覆盖主流电子书格式&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://designtool.site/" target="_blank" rel="noopener noreferrer">设计工具箱&lt;/a>
&lt;/strong> —— 免费在线设计工具合集&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.deepl.com/zh" target="_blank" rel="noopener noreferrer">DeepL翻译工具&lt;/a>
&lt;/strong> —— 功能最全的翻译工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://steampp.net/" target="_blank" rel="noopener noreferrer">Watt Toolkit工具箱&lt;/a>
&lt;/strong> —— 一个开源跨平台的多功能 Steam 工具箱&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://refont.ai/zh" target="_blank" rel="noopener noreferrer">AI 字体生成器&lt;/a>
&lt;/strong> —— 免费创作独特的纹身、签名和手写文本&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.calligrapher.ai/" target="_blank" rel="noopener noreferrer">Calligrapher&lt;/a>
&lt;/strong> —— 免费创作英文手写签名&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://oklch.fyi/" target="_blank" rel="noopener noreferrer">OKLCH colors&lt;/a>
&lt;/strong> —— OKLCH色彩模型的工作原理探索工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://palettt.com/" target="_blank" rel="noopener noreferrer">Palettt&lt;/a>
&lt;/strong> —— OKLCH 色彩调色板生成器与色彩工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.devkitlab.com/zh/tools/" target="_blank" rel="noopener noreferrer">DevKitLab&lt;/a>
&lt;/strong> —— 给开发者使用的工具集&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h3 id="有趣的网站">有趣的网站&lt;/h3>
&lt;div class="page-card">
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://g2.ltfc.net/" target="_blank" rel="noopener noreferrer">中华珍宝馆&lt;/a>
&lt;/strong> —— 中国历代书法绘画在线欣赏&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.qijishow.com/" target="_blank" rel="noopener noreferrer">奇迹秀&lt;/a>
&lt;/strong> —— 设计师的宝藏网站&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.nbfox.com/" target="_blank" rel="noopener noreferrer">麦田艺术&lt;/a>
&lt;/strong> —— 高清油画免费下载&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://neal.fun/" target="_blank" rel="noopener noreferrer">Neal.fun&lt;/a>
&lt;/strong> —— 打发时间的解压小游戏&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h3 id="开源工具">开源工具&lt;/h3>
&lt;div class="page-card">
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://fmhy.net/" target="_blank" rel="noopener noreferrer">FMHY&lt;/a>
&lt;/strong> —— 互联网最大的免费资源收藏&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://cn.pattern.monster/" target="_blank" rel="noopener noreferrer">SVG图案生成器&lt;/a>
&lt;/strong> —— 在SVG中创建无缝图案，用作网站背景、头部图片等设计&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://bumpmesh.com/" target="_blank" rel="noopener noreferrer">BumpMesh&lt;/a>
&lt;/strong> —— 给3D模型添加纹理的工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://www.ghxi.com/devsidecar.html" target="_blank" rel="noopener noreferrer">DevsideCar&lt;/a>
&lt;/strong> —— 通过本地代理加速访问国外网站&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://mineru.net/" target="_blank" rel="noopener noreferrer">MinerU&lt;/a>
&lt;/strong> —— 智能文档解析工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://readest.com/" target="_blank" rel="noopener noreferrer">Readest&lt;/a>
&lt;/strong> —— 电子书阅读器&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://revezone.com/index.html" target="_blank" rel="noopener noreferrer">Revezone&lt;/a>
&lt;/strong> —— 一个轻量级、以本地为先、以图为中心的思维管理工具&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://moriafly.com/program/salt-player.html" target="_blank" rel="noopener noreferrer">Salt Player&lt;/a>
&lt;/strong> —— 本地音乐播放器&lt;/li>
&lt;/ul>
&lt;/div></description></item><item><title>关于我</title><link>https://mythstraw.github.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/about/</guid><description>&lt;h1 id="关于我">关于我&lt;/h1>
&lt;h2 id="hi-foreveryang">嗨！👋 这里是 &lt;mark>ForeverYang&lt;/mark> 的个人博客。&lt;/h2>
&lt;div class="page-card">
&lt;p>我是一名&lt;strong>家装设计师&lt;/strong>，习惯在图纸上构建空间；我也是一名 &lt;strong>3D 打印玩家&lt;/strong>，喜欢把虚拟的想象打印成真实的触感。我对这个世界充满好奇，尤其是&lt;strong>科技&lt;/strong>带来的一切变革。&lt;/p>
&lt;p>目前，我正以 &lt;strong>AI 新手&lt;/strong>的身份，一头扎进人工智能的浪潮里。&lt;br>
带着一点 Python 基础，我折腾过 Codex、OpenCode、NanoBot、WorkBuddy、n8n等工具。从写第一个 AI Skill，到搭建网页端 App，再到构建这个个人网站……&lt;/p>
&lt;p>我享受这种“一点点尝试，一点点进步”的养成感。&lt;br>
在这里，我会毫无保留地分享我的探索过程，希望能为你带来一点微光。&lt;/p>
&lt;p>在代码与设计之外，我的生活还有两个避风港：&lt;br>
🎸 戴上耳机，听&lt;strong>赵雷&lt;/strong> 🦔，在民谣的吉他声里感受人间烟火；&lt;br>
⚓️ 翻开漫画，看&lt;strong>海贼王&lt;/strong> 🏴‍☠️，跟着路飞一起向往那片自由的海。&lt;/p>
&lt;p>这个博客，是我记录&lt;strong>科技探索&lt;/strong>与&lt;strong>知识沉淀&lt;/strong>的自留地。&lt;br>
很高兴认识你，希望这里的文字能与你产生共鸣。✨&lt;/p>
&lt;/div>
&lt;h2 id="联系方式">联系方式&lt;/h2>
&lt;div class="page-card">
&lt;p>邮箱：&lt;a href="mailto:mythstraw@msn.com">mythstraw@msn.com&lt;/a>
&lt;/p>
&lt;p>欢迎来信，或者直接&lt;a href="https://mythstraw.github.io/index.xml">订阅 RSS&lt;/a>
。&lt;/p>
&lt;/div></description></item><item><title>名句库</title><link>https://mythstraw.github.io/quotes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://mythstraw.github.io/quotes/</guid><description>&lt;h1 id="名句库">名句库&lt;/h1>
&lt;p>首页每天显示的那一句，就是从下面这些名句里轮换出来的：轮到哪条由&lt;strong>访客本地的日期&lt;/strong>决定&lt;br>
（算法：距 2000-01-01 的天数 mod 名句条数），所以同一天打开看到的是同一条，隔天自动换。&lt;/p>
&lt;p>名句内容单独存放在站点根目录的 &lt;code>data/quotes.yaml&lt;/code>，想加、想删、想改直接编辑那个文件就行——&lt;br>
列表顺序就是轮换顺序，条数变了也不用改别的地方。下面这份清单会自动跟着更新，&lt;br>
带「今天」标记的那条就是此刻首页显示的那句。&lt;/p>




&lt;ol class="quote-list" id="quote-list">
 
 &lt;li>
 &lt;span class="q-text">我们终此一生，就是要摆脱他人的期待，找到真正的自己&lt;/span>&lt;span class="q-author">伍绮诗《无声告白》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">不是所有人都有勇气在明知前路艰难的情况下继续往前奋跑的&lt;/span>&lt;span class="q-author">《冲·撞》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">在人生的路途中，如果我们愿意而且有能力做到两点:放眼前途，容忍异己，我们会受益良多。前者让我们不受损失和伤害，后者可以使我们免于争论和口角&lt;/span>&lt;span class="q-author">叔本华&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">我现在渴望的并非快乐，但求自己不要无知。人们总以为自己和这个世界是隔离的，但只需一株伫立在金色尘埃中的橄榄树，或晨曦下几片亮晶晶的沙滩，也许就能让我们察觉到内心的抗拒正在消解&lt;/span>&lt;span class="q-author">阿尔贝·加缪&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">世界就是你自己，这个真理适用于生活中的所有人。当你懂得这个道理后，你就会意识到，你不认识什么太阳、地球，而永远只承认自己的双眼和双手，因为太阳为眼睛所见，地球为双手所感知&lt;/span>&lt;span class="q-author">叔本华&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">无人问津也好，技不如人也罢，你都要试着安静下来，去做自己该做的事，而不是让内心的烦躁、焦虑，毁掉你本就不多的热情和定力&lt;/span>&lt;span class="q-author">《人民日报》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">好的和坏的我们都收下吧，然后一声不响继续生活，如此我们才能活得干净、自在，几乎接近幸福，如此我们才敢面对那些美好的事物说：我爱着&lt;/span>&lt;span class="q-author">海桑《 这世界如此喧闹》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">重要的不是过去，而是你现在变成的样子&lt;/span>&lt;span class="q-author">《狮子王》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">要完全与另一个人发生关联，必须先跟自己发生关联。如果我们不能拥抱我们自身的孤独，就只是利用他人作为对抗孤立的挡箭牌而已。只有当人可以活得像只老鹰，不需要任何观众，才能爱慕地转向另一个人。只有在那个时候，一个人才能够去关心另一个存在的生长。&lt;/span>&lt;span class="q-author">欧文·亚隆《当尼采哭泣》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">内心过分单纯和敏锐、看问题的目光过于明察秋毫，实际并无好处。处理人间事务时粗线条即可，不必过分深究。世间万事万物，总存在太多彼此矛盾的方面和各不相同的形式，考虑多了，反而迷茫&lt;/span>&lt;span class="q-author">蒙田《蒙田随笔》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">跟志趣相投的人共事，跟思维同频的人生活，跟互相喜欢的朋友呆在一起，是理想的生活&lt;/span>&lt;span class="q-author">李雪琴&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">有一些人，在出生的地方，他们好像是过客，孩提时代就非常熟悉的浓荫郁郁的小巷，同伙伴们游戏其中的人烟稠密的街衢，对他们来说都不过是旅途中的一个宿站&lt;/span>&lt;span class="q-author">毛姆《月亮与六便士》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">认识自己的无知，是认识世界最可靠的方法&lt;/span>&lt;span class="q-author">蒙田&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">真正的发现之旅，不在于寻找新的风景，而在于拥有新的眼光&lt;/span>&lt;span class="q-author">普鲁斯特&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">我们读书，是为了知道自己并不孤单。&lt;/span>&lt;span class="q-author">C.S.路易斯&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">每一个不曾起舞的日子，都是对生命的辜负&lt;/span>&lt;span class="q-author">尼采&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">世界上只有一种真正的英雄主义，就是在认清生活真相之后依然热爱生活&lt;/span>&lt;span class="q-author">罗曼·罗兰&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">耐心是一切聪明才智的基础&lt;/span>&lt;span class="q-author">柏拉图&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">人感知的不是英寸、米、磅和加仑，他只感到热，感到冷，感到轻重。他还懂得恨和爰、骄傲和绝望。感受是无法以公式计算的，情绪也没有换算因数&lt;/span>&lt;span class="q-author">罗杰·泽拉兹尼&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">你的时间有限，不要浪费时间过别人的生活&lt;/span>&lt;span class="q-author">史蒂夫·乔布斯&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">去读书，去学习，去受教育，记住掌握知识不是目的而是手段，最重要的是我们可以拥有选择的机会&lt;/span>&lt;span class="q-author">《我的天才女友》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">一个人之所以有意思，是因为他大量阅读，习惯思考，放缓脚步，投入深度对话，并为自己创建了一个丰满的内心世界&lt;/span>&lt;span class="q-author">威廉 · 德雷谢维奇&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">没有一劳永逸，永远要重新开始，重新进入动荡，重新寻找，重新赢得欢喜&lt;/span>&lt;span class="q-author">是枝裕和《步履不停》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">我也不想要这么念旧，念旧的人很寂寞，风吹心动，就期待是你回来过。没有人愿意沉湎于回忆，只不过美好的都属于过去。星星发亮是为了让每一个人有一天都能找到属于自己的星星&lt;/span>&lt;span class="q-author">《小王子》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">在人生或者职业的各种事务中，性格的作用比智力大得多，头脑的作用不如心情，天资不如由判断力所节制着的自制，耐心和规律&lt;/span>&lt;span class="q-author">海明威《真实的高贵》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">其实所有纠结做选择的人心里早就有了答案，咨询只是想得到内心所倾向的选择。最终的所谓命运，还是自己一步步走出来的&lt;/span>&lt;span class="q-author">东野奎吾《解忧杂货店》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">一个人的兴趣越广泛，他拥有的快乐机会就越多，而受命运拨弄的可能性也就越小，因为即使失去了某一种兴趣，他仍然可以转向另一种&lt;/span>&lt;span class="q-author">《幸福之路》罗素&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">你能在浪费时间中获得乐趣，就不是浪费时间&lt;/span>&lt;span class="q-author">伯特兰.罗素&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">我期许自己要活得更真实也更诚实，要更接受甚至喜欢自己身上起伏的每部分，才能更喜欢这世界&lt;/span>&lt;span class="q-author">蔡崇达《皮囊》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">吹毛求疵的人即便在天堂也能挑出瑕疵。一个安心的人在哪都可以过自得其乐的生活&lt;/span>&lt;span class="q-author">《瓦尔登湖》梭罗&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">现在不是去想缺少什么的时候，该想一想凭现有的东西你能做什么&lt;/span>&lt;span class="q-author">海明威《老人与海》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">过去不是有形的东西，也不必依靠有形的物体来缅怀提醒。过去是造成今日我们本身的必须过程，它存在我们生命中，是遗失不了的&lt;/span>&lt;span class="q-author">三毛《谈心》&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">当暴风雨过去，你不会记得自己是如何度过，你甚至不确定暴风雨是否真正结束，但你不再是当初走进暴风雨里的那个人。这就是暴风雨的意义。&lt;/span>&lt;span class="q-author">村上春树&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">也许每个人心中都有一个风筝，无论它意味着什么，让我们勇敢地去追寻&lt;/span>&lt;span class="q-author">《追风筝的人》卡勒德·胡赛尼&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">年轻时并不知道自己想要过什么样的生活，但一直清楚地知道我不要过什么样的生活。那些能预知的，经过权衡算计的世俗生活对我毫无吸引力，我要的不是成功，而是看到生命的奇迹&lt;/span>&lt;span class="q-author">《像我这样笨拙地生活》廖一梅&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">我心中已经听到来自远方的呼唤，再不需要回过头去关心身后的种种是非与议论&lt;/span>&lt;span class="q-author">米兰·昆德拉&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">人们总是用一生来等待开始新的生活，这是很常见的现象。等待是思维的一个状态，意味着你需要未来，而你不要现在。你不要此时此刻，你把希望寄托于未来。丧失对当下时刻的意识，会大大地降低你的生命质量&lt;/span>&lt;span class="q-author">《当下的力量》埃克哈特·托利&lt;/span>
 &lt;/li>
 
 &lt;li>
 &lt;span class="q-text">在一个崇高的目标支持下，不停地工作，即使慢，也一定会获得成功&lt;/span>&lt;span class="q-author">爱因斯坦&lt;/span>
 &lt;/li>
 
&lt;/ol>
&lt;style>
 ol.quote-list {
 padding-left: 1.5em;
 }

 ol.quote-list li {
 margin: 10px 0;
 line-height: 1.7;
 }

 ol.quote-list span.q-author {
 margin-left: 8px;
 font-size: 0.88em;
 color: var(--text-color-tertiary);
 white-space: nowrap;
 }

 
 ol.quote-list span.q-author::before {
 content: "—— ";
 }

 
 ol.quote-list li.is-today {
 font-weight: 700;
 }

 ol.quote-list li.is-today span.q-author {
 color: var(--text-color-secondary);
 }

 ol.quote-list span.q-today {
 margin-left: 8px;
 padding: 1px 8px;
 border: 1px solid var(--border-color);
 border-radius: 999px;
 background-color: var(--bg-color-secondary);
 font-size: 0.78em;
 font-weight: 400;
 color: var(--text-color-secondary);
 white-space: nowrap;
 }
&lt;/style>
&lt;script>
 (function () {
 var list = document.getElementById('quote-list');
 if (!list || !list.children.length) { return; }
 var n = list.children.length;
 var now = new Date();
 var days = Math.round((new Date(now.getFullYear(), now.getMonth(), now.getDate()) - new Date(2000, 0, 1)) / 86400000);
 var idx = ((days % n) + n) % n;
 var li = list.children[idx];
 if (!li) { return; }
 li.className = 'is-today';
 var badge = document.createElement('span');
 badge.className = 'q-today';
 badge.textContent = "今天";
 li.appendChild(badge);
 })();
&lt;/script>

</description></item></channel></rss>