<?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://blog.foreveryang.top/</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>Sun, 27 Sep 2026 10:11:00 +0800</lastBuildDate><atom:link href="https://blog.foreveryang.top/index.xml" rel="self" type="application/rss+xml"/><item><title>使用 Hugo + GitHub 部署博客</title><link>https://blog.foreveryang.top/p/hugo-github-deploy/</link><pubDate>Sun, 27 Sep 2026 10:11:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/p/hugo-github-deploy/</guid><description>&lt;h2 id="一hugo-是什么"&gt;一、Hugo 是什么？&lt;/h2&gt;
&lt;p&gt;Hugo 是一个用 Go 语言编写的静态网站生成器（SSG），自 2013 年发布以来，以其&lt;strong&gt;极快的构建速度&lt;/strong&gt;和&lt;strong&gt;简单的部署方式&lt;/strong&gt;在开发者社区中广受欢迎。&lt;/p&gt;
&lt;h3 id="-hugo-的核心优势"&gt;⚡ Hugo 的核心优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极致的构建速度&lt;/strong&gt;：这是 Hugo 最突出的标签。由于采用 Go 语言编译，它的构建速度在同类工具中处于领先地位。根据基准测试，构建一个包含 5,000 页的网站，Hugo 仅需约 &lt;strong&gt;2.1 秒&lt;/strong&gt;，而 Jekyll 则需要约 &lt;strong&gt;4 分钟&lt;/strong&gt;。对于内容量大的站点，这个优势会非常明显。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单的部署与零依赖&lt;/strong&gt;：Hugo 以单个二进制文件的形式分发，你下载后即可使用，无需安装 Ruby、Node.js 等运行时环境或处理复杂的依赖关系。这使得它在任何操作系统上的安装和部署都极其简单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内置丰富功能&lt;/strong&gt;：Hugo 自带了许多开箱即用的功能，例如多语言支持、强大的分类系统（Tags/Categories）、图片处理管道以及对 SASS/SCSS 的原生支持，无需依赖外部插件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-hugo-的局限性"&gt;⚠️ Hugo 的局限性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模板系统学习曲线较陡&lt;/strong&gt;：Hugo 使用 Go 语言的 &lt;code&gt;html/template&lt;/code&gt; 语法，对于不熟悉 Go 的开发者来说，其语法和逻辑可能不太直观，相比 Jekyll 的 Liquid 或 Hexo 的 EJS 等模板语言，需要更多的学习时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺乏官方插件系统&lt;/strong&gt;：Hugo 没有像 Jekyll 或 Hexo 那样成熟的插件生态系统。虽然可以通过 Shortcodes、主题和 Hugo Modules 进行扩展，但实现高度自定义的功能时，可能不如有插件系统的工具灵活。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题生态相对有限&lt;/strong&gt;：虽然 Hugo 拥有超过 900 个主题，但与 Hexo 等拥有庞大社区和丰富主题数量的工具相比，其主题库在数量和一些特定需求的覆盖上可能稍显不足。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-与其他主流工具的横向对比"&gt;🔍 与其他主流工具的横向对比&lt;/h3&gt;
&lt;p&gt;为了更直观地展示差异，下表汇总了 Hugo 与几款主流 SSG 的核心特性：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;编程语言&lt;/th&gt;
 &lt;th&gt;构建速度&lt;/th&gt;
 &lt;th&gt;学习曲线&lt;/th&gt;
 &lt;th&gt;核心优势&lt;/th&gt;
 &lt;th&gt;最适合场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Go&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;极快&lt;/strong&gt; (毫秒/秒级)&lt;/td&gt;
 &lt;td&gt;中等&lt;/td&gt;
 &lt;td&gt;速度最快、单二进制、零依赖&lt;/td&gt;
 &lt;td&gt;大型站点、内容密集型网站、追求极致性能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Ruby&lt;/td&gt;
 &lt;td&gt;较慢 (分钟级)&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;GitHub Pages 原生支持、成熟的插件生态&lt;/td&gt;
 &lt;td&gt;简单的博客、GitHub Pages 托管&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hexo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;丰富的插件和主题生态、对 JS 开发者友好&lt;/td&gt;
 &lt;td&gt;个人博客、Node.js 技术栈用户&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript (React)&lt;/td&gt;
 &lt;td&gt;较慢&lt;/td&gt;
 &lt;td&gt;陡峭&lt;/td&gt;
 &lt;td&gt;强大的 React 组件和 GraphQL 数据层&lt;/td&gt;
 &lt;td&gt;复杂的 React 应用、需要大量动态交互的站点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript (多框架)&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;默认零 JS、支持多框架组件、内容驱动&lt;/td&gt;
 &lt;td&gt;现代内容网站、电商落地页、追求最小化 JS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;简单&lt;/td&gt;
 &lt;td&gt;配置灵活、不依赖特定前端框架、对 JS 生态友好&lt;/td&gt;
 &lt;td&gt;偏好 JS 工具链的开发者、注重灵活性的项目&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;综合来看，Hugo 的核心竞争力在于 &lt;strong&gt;“速度”&lt;/strong&gt; 和 &lt;strong&gt;“简洁”&lt;/strong&gt;。它非常适合以下场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内容量大、更新频繁的博客或文档站点&lt;/strong&gt;：构建速度的优势会极大提升开发体验和部署效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不想深入折腾前端工具链的开发者&lt;/strong&gt;：单二进制文件、零依赖的特性让部署和维护变得非常简单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对网站性能有极致要求的场景&lt;/strong&gt;：Hugo 生成的静态站点本身就非常轻量，配合 CDN 可以轻松获得极快的加载速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二整体部署流程概述简单了解"&gt;二、整体部署流程概述（简单了解）&lt;/h2&gt;
&lt;p&gt;使用 Hugo 和 GitHub 部署博客，整个流程可以概括为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在本地用 Hugo 生成静态网站 → 通过 Git 推送到 GitHub 仓库 → 再由 GitHub Actions 自动构建并发布到 GitHub Pages。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="-整体流程概览"&gt;🧭 整体流程概览&lt;/h3&gt;
&lt;p&gt;整个部署管线大致分为四个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地环境搭建&lt;/strong&gt;：安装 Hugo 和 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建与配置站点&lt;/strong&gt;：初始化 Hugo 站点，选择并配置主题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编写与预览内容&lt;/strong&gt;：用 Markdown 写文章，本地启动服务预览。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接 GitHub 并自动化部署&lt;/strong&gt;：将代码推送到 GitHub，配置 Actions 自动构建和发布。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤一准备工作与本地搭建"&gt;🛠️ 步骤一：准备工作与本地搭建&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装必要工具&lt;/strong&gt;&lt;br&gt;
你需要在本地安装 &lt;strong&gt;Hugo&lt;/strong&gt;（建议安装 &lt;strong&gt;extended&lt;/strong&gt; 扩展版，因为许多主题依赖 SCSS 支持）和 &lt;strong&gt;Git&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: &lt;code&gt;brew install hugo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;scoop install hugo-extended&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;: &lt;code&gt;sudo snap install hugo&lt;/code&gt; 或 &lt;code&gt;sudo apt install hugo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建 Hugo 站点并初始化 Git&lt;/strong&gt;&lt;br&gt;
在终端中运行以下命令，创建一个名为 &lt;code&gt;my-blog&lt;/code&gt; 的站点，并初始化 Git 仓库：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new site my-blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择并安装主题&lt;/strong&gt;&lt;br&gt;
Hugo 有丰富的主题生态，中文友好的热门主题包括 &lt;strong&gt;PaperMod&lt;/strong&gt;、&lt;strong&gt;LoveIt&lt;/strong&gt;、&lt;strong&gt;hugo-theme-stack&lt;/strong&gt; 等。以 PaperMod 为例，通过 Git 子模块安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，在站点配置文件 &lt;code&gt;hugo.toml&lt;/code&gt;（或 &lt;code&gt;config.toml&lt;/code&gt;）中启用主题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PaperMod&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础站点配置&lt;/strong&gt;&lt;br&gt;
编辑 &lt;code&gt;hugo.toml&lt;/code&gt;，至少设置以下关键项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;baseURL&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://你的用户名.github.io/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;languageCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;我的博客&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤二编写内容与本地预览"&gt;✍️ 步骤二：编写内容与本地预览&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建新文章&lt;/strong&gt;&lt;br&gt;
使用 &lt;code&gt;hugo new&lt;/code&gt; 命令创建文章，它会根据模板自动生成 Front Matter（元数据）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new posts/my-first-post.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开生成的文件，将 &lt;code&gt;draft: true&lt;/code&gt; 改为 &lt;code&gt;false&lt;/code&gt;，文章才会被正式发布。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;本地预览&lt;/strong&gt;&lt;br&gt;
启动 Hugo 内置的开发服务器，实时预览效果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;访问 &lt;code&gt;http://localhost:1313/&lt;/code&gt; 即可查看。&lt;code&gt;-D&lt;/code&gt; 参数表示包含草稿文章。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤三推送到-github-并启用-pages"&gt;🚀 步骤三：推送到 GitHub 并启用 Pages&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建 GitHub 仓库&lt;/strong&gt;&lt;br&gt;
在 GitHub 上新建一个仓库。&lt;strong&gt;关键点&lt;/strong&gt;：如果你希望博客地址是 &lt;code&gt;https://你的用户名.github.io&lt;/code&gt;，仓库名应设置为 &lt;code&gt;你的用户名.github.io&lt;/code&gt;；如果是项目站点，仓库名可以任意，但地址会多一级子路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推送本地代码&lt;/strong&gt;&lt;br&gt;
在本地仓库中添加远程地址并推送：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin https://github.com/你的用户名/仓库名.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Initial commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启用 GitHub Pages&lt;/strong&gt;&lt;br&gt;
进入仓库的 &lt;strong&gt;Settings &amp;gt; Pages&lt;/strong&gt;，将 &lt;strong&gt;Source&lt;/strong&gt; 从 “Deploy from a branch” 改为 &lt;strong&gt;“GitHub Actions”&lt;/strong&gt;。这个改动是立即生效的，无需保存按钮。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-步骤四配置-github-actions-自动部署"&gt;⚙️ 步骤四：配置 GitHub Actions 自动部署&lt;/h3&gt;
&lt;p&gt;这是实现“推送即部署”的核心。你需要创建一个 GitHub Actions 工作流文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建工作流文件&lt;/strong&gt;&lt;br&gt;
在站点根目录下创建 &lt;code&gt;.github/workflows/hugo.yaml&lt;/code&gt; 文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置工作流内容&lt;/strong&gt;&lt;br&gt;
将以下官方示例内容粘贴进去（注意根据你的 Hugo 版本和分支名微调）。这个工作流会在你向 &lt;code&gt;main&lt;/code&gt; 分支推送代码时，自动安装 Hugo、构建站点并部署到 GitHub Pages：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deploy Hugo site to Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;read&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;write&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id-token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;write&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.147.9&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Install Hugo CLI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; 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&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Checkout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;submodules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;recursive&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fetch-depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Setup Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/configure-pages@v5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build with Hugo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_CACHEDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ runner.temp }}/hugo_cache&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;HUGO_ENVIRONMENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; hugo \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --minify \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Upload artifact&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./public&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;github-pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.deployment.outputs.page_url }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;needs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deploy to GitHub Pages&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/deploy-pages@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推送并触发部署&lt;/strong&gt;&lt;br&gt;
提交这个工作流文件并推送到 GitHub。推送后，GitHub Actions 会自动开始运行。你可以在仓库的 &lt;strong&gt;Actions&lt;/strong&gt; 标签页下查看构建和部署的实时日志。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="-后续写作与发布流程"&gt;🔄 后续写作与发布流程&lt;/h3&gt;
&lt;p&gt;完成上述配置后，你日常的写作和发布流程会非常简洁：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地写作&lt;/strong&gt;：用 &lt;code&gt;hugo new posts/文章名.md&lt;/code&gt; 创建文章，用 Markdown 编辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地预览&lt;/strong&gt;：&lt;code&gt;hugo server -D&lt;/code&gt; 确认效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一键发布&lt;/strong&gt;：&lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m &amp;quot;更新文章&amp;quot; &amp;amp;&amp;amp; git push&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;推送后，GitHub Actions 会在云端自动完成构建和部署，几分钟后你的博客就会更新。&lt;/p&gt;
&lt;h3 id="-关键提醒"&gt;💡 关键提醒&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;baseURL&lt;/code&gt; 配置&lt;/strong&gt;：务必在 &lt;code&gt;hugo.toml&lt;/code&gt; 中正确设置 &lt;code&gt;baseURL&lt;/code&gt;，否则部署后可能出现样式或链接错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题更新&lt;/strong&gt;：如果通过 Git 子模块安装主题，在克隆仓库或 Actions 中构建时，需要使用 &lt;code&gt;--recursive&lt;/code&gt; 参数来拉取主题代码，上述工作流示例中已包含 &lt;code&gt;submodules: recursive&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义域名&lt;/strong&gt;：如果你绑定了自定义域名，需要在仓库的 Pages 设置中配置，并相应调整 &lt;code&gt;baseURL&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三hugo-其他安装方式"&gt;三、Hugo 其他安装方式&lt;/h2&gt;
&lt;p&gt;Hugo 还支持免本地安装的构建和部署方式。得益于其“单二进制文件”的设计，你可以将构建过程完全放在云端完成，本地只需要一个浏览器和 Git 即可。&lt;/p&gt;
&lt;h3 id="-方式一利用-github-actions-自动构建"&gt;☁️ 方式一：利用 GitHub Actions 自动构建&lt;/h3&gt;
&lt;p&gt;只需要在项目仓库中配置好 GitHub Actions 工作流（如之前封装好的 &lt;code&gt;hugo.yaml&lt;/code&gt;），每次将 Markdown 源文件推送到 GitHub 后，Actions 的虚拟环境会自动安装 Hugo、构建站点并部署到 GitHub Pages。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心配置&lt;/strong&gt;：&lt;br&gt;
在 &lt;code&gt;hugo.yaml&lt;/code&gt; 中，你只需要通过 &lt;code&gt;peaceiris/actions-hugo@v3&lt;/code&gt; 这个 Action 来按需安装指定版本的 Hugo（支持 extended 版本和 Hugo Modules），它会在几秒内完成安装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Setup Hugo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;peaceiris/actions-hugo@v3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hugo-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.147.9&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，你的本地环境就完全不需要 Hugo，只需负责编写 Markdown 和推送代码。&lt;/p&gt;
&lt;h3 id="-方式二使用-docker-容器"&gt;🐳 方式二：使用 Docker 容器&lt;/h3&gt;
&lt;p&gt;如果你需要在本地进行&lt;strong&gt;实时预览&lt;/strong&gt;，但不想直接安装 Hugo 到系统里，Docker 是最佳选择。&lt;/p&gt;
&lt;p&gt;你可以直接运行官方的 Hugo Docker 镜像，将本地项目目录挂载到容器中，即可在容器内执行 &lt;code&gt;hugo server&lt;/code&gt; 命令。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 示例：使用官方镜像启动本地预览服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:/src &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 1313:1313 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ghcr.io/gohugoio/hugo:latest server --bind 0.0.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种方式将 Hugo 的运行环境隔离在容器内，不会污染你的主机系统，同时还能获得完整的本地开发体验。&lt;/p&gt;
&lt;h3 id="-方式三使用云构建服务平台"&gt;🚀 方式三：使用云构建服务平台&lt;/h3&gt;
&lt;p&gt;一些静态网站托管平台（如 &lt;strong&gt;Netlify&lt;/strong&gt;、&lt;strong&gt;Vercel&lt;/strong&gt;、&lt;strong&gt;EdgeOne Pages&lt;/strong&gt; 等）内置了对 Hugo 的支持。&lt;/p&gt;
&lt;p&gt;你只需要将 GitHub 仓库连接到这些平台，它们会自动检测到这是一个 Hugo 项目，并在云端完成构建和部署，实现真正的“零配置”持续集成。&lt;/p&gt;
&lt;p&gt;对于“Hugo + GitHub”的博客方案，&lt;strong&gt;使用 GitHub Actions 进行云端构建是最简洁、最一致的路径&lt;/strong&gt;。你的本地角色可以简化为“内容创作者”，只需专注于用 Markdown 写作和 &lt;code&gt;git push&lt;/code&gt; 即可。&lt;/p&gt;
&lt;h2 id="四使用-ai-工具自动部署"&gt;四、使用 AI 工具自动部署&lt;/h2&gt;
&lt;p&gt;下面是一个完整的 Skill 技能，整合了 &lt;strong&gt;Hugo 博客部署&lt;/strong&gt; 和 &lt;strong&gt;自定义编辑&lt;/strong&gt; 两大流程。你只需将整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放入任何 agent 的 &lt;code&gt;skills/&lt;/code&gt; 目录，即可通过自然语言触发。&lt;/p&gt;
&lt;p&gt;我用的是 nanobot，其他 AI 工具一样，&lt;strong&gt;保险起见可以让 AI 对 skill 做一次校验&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-目录结构"&gt;📁 目录结构&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skills/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── hugo-blog-manager/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── _common.ps1 # 公共函数：DryRun 预演、hugo 定位、UTF-8 写文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── check_env.ps1 # 只读环境体检
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── install_hugo.ps1 # 安装 hugo（本地 winget / Docker）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── init_site.ps1 # 新建站点 + git init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── install_theme.ps1 # 装主题并写入 theme:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── preview.ps1 # hugo server 本地预览
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── push_github.ps1 # 提交并推送
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── setup_actions.ps1 # 生成 GitHub Actions 部署 workflow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;脚本全部是 PowerShell（Windows 原生，不依赖 WSL / Git Bash），并且&lt;strong&gt;每个脚本都带 &lt;code&gt;-DryRun&lt;/code&gt;&lt;/strong&gt;：只打印将要执行的命令，不做任何改动。这就是整个 Skill「确认式执行」的地基——先预演给用户看，用户点头了才实跑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="-skillmd"&gt;📄 SKILL.md&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: hugo-blog-manager
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nanobot:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; emoji: 📝
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; requires:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bins: [&amp;#34;git&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Hugo 博客管理器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;两个工作流：**流程 A 部署新博客**、**流程 B 安全修改现有站点**。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;脚本目录（下文记作 &lt;span class="sb"&gt;`$S`&lt;/span&gt;，调用时替换成这个技能的真实路径）：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$S = &amp;lt;skills&amp;gt;\hugo-blog-manager\scripts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;运行时的当前目录不是技能目录，**调用脚本必须用绝对路径**。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 两条硬性规则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Hugo 本体安装必须先问用户**&lt;/span&gt;。只能在用户明确选择「本地安装」（winget &lt;span class="sb"&gt;`Hugo.Hugo.Extended`&lt;/span&gt;）或「Docker 安装」（拉 hugo 镜像，用 &lt;span class="sb"&gt;`docker run`&lt;/span&gt; 跑）之后，才通过 &lt;span class="sb"&gt;`install_hugo.ps1`&lt;/span&gt; 执行。不要自动安装，不要替用户选。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**主题必须现场问用户**&lt;/span&gt;。本技能不预设任何主题。走到装主题那一步时，先给 3~4 个候选（各自特点 + 仓库地址）让用户挑，选定后才跑 &lt;span class="sb"&gt;`install_theme.ps1`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 确认式执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;每个关键节点三步走：先跑 &lt;span class="sb"&gt;`-DryRun`&lt;/span&gt; → 把命令和影响讲给用户 → 用户明确同意后去掉 &lt;span class="sb"&gt;`-DryRun`&lt;/span&gt; 实跑。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 全局前置检查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```powershell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\check_env.ps1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;只读体检（hugo / git / docker / winget），退出码 &lt;span class="sb"&gt;`0`&lt;/span&gt;=就绪、&lt;span class="sb"&gt;`1`&lt;/span&gt;=hugo 缺失、&lt;span class="sb"&gt;`2`&lt;/span&gt;=git 缺失、&lt;span class="sb"&gt;`3`&lt;/span&gt;=两者都缺。hugo 缺失时**不要自己装**，转去问用户选哪种方式：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```powershell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\install_hugo.ps1&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;-DryRun&lt;/span&gt; &lt;span class="c"&gt;# 本地安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;\install_hugo.ps1&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Method&lt;/span&gt; &lt;span class="n"&gt;Docker&lt;/span&gt; &lt;span class="n"&gt;-DryRun&lt;/span&gt; &lt;span class="c"&gt;# Docker 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;装完重跑 &lt;span class="sb"&gt;`check_env.ps1`&lt;/span&gt; 确认；本地安装后若 &lt;span class="sb"&gt;`hugo`&lt;/span&gt; 仍不可见，提醒用户新开终端刷新 PATH。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 流程 A：部署新博客
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;按顺序走，每步先 DryRun 再等确认。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**环境检查**&lt;/span&gt; —— 见上。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**确定站点位置与标题**&lt;/span&gt; —— 问用户博客放哪个目录、叫什么名字（&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 后续可改）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**创建站点**&lt;/span&gt;：&lt;span class="sb"&gt;`init_site.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -Title &amp;#34;&amp;lt;标题&amp;gt;&amp;#34;`&lt;/span&gt; → &lt;span class="sb"&gt;`hugo new site --format yaml`&lt;/span&gt; + &lt;span class="sb"&gt;`git init -b main`&lt;/span&gt; + 写 &lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt; 与 &lt;span class="sb"&gt;`.gitignore`&lt;/span&gt;。目标目录必须为空，脚本拒绝覆盖已有内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**选主题（必须先问用户）**&lt;/span&gt;：&lt;span class="sb"&gt;`install_theme.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34; -ThemeName &amp;lt;名&amp;gt; -ThemeRepo &amp;lt;仓库地址&amp;gt;`&lt;/span&gt;。默认走 &lt;span class="sb"&gt;`git submodule`&lt;/span&gt;（主题可后续升级）；GitHub 不可达时脚本会报错并提示改用 &lt;span class="sb"&gt;`-Mode Zip -ZipUrl &amp;lt;镜像 zip 地址&amp;gt;`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**本地预览，交给用户确认**&lt;/span&gt;：&lt;span class="sb"&gt;`preview.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span&gt;（&lt;span class="sb"&gt;`hugo server`&lt;/span&gt;，默认 http://127.0.0.1:1313/）。这是前台长进程，用后台会话跑；**界面效果必须由用户在浏览器确认**，不要用 HTTP 探测 localhost 代替。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**建 GitHub 仓库**&lt;/span&gt;（让用户在网页端建，**不要勾 README / .gitignore**），然后推送：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`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&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;7.&lt;/span&gt; &lt;span class="gs"&gt;**配置自动部署**&lt;/span&gt;：&lt;span class="sb"&gt;`setup_actions.ps1 -SitePath &amp;#34;&amp;lt;目录&amp;gt;&amp;#34;`&lt;/span&gt; 写 &lt;span class="sb"&gt;`.github/workflows/hugo.yaml`&lt;/span&gt; 并推送。Hugo 版本自动取自本地 hugo 或 hugo 容器，也可 &lt;span class="sb"&gt;`-HugoVersion x.y.z`&lt;/span&gt; 指定。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;8.&lt;/span&gt; &lt;span class="gs"&gt;**收尾**&lt;/span&gt;：提醒用户去仓库 &lt;span class="sb"&gt;`Settings → Pages → Source`&lt;/span&gt; 选 &lt;span class="gs"&gt;**GitHub Actions**&lt;/span&gt;（一次性手动步骤），之后每次 push 自动发布。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 流程 B：安全修改现有站点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**先读再动**&lt;/span&gt;。定位改动点：&lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt;（站点配置）、&lt;span class="sb"&gt;`content/`&lt;/span&gt;（文章 / Front Matter）、&lt;span class="sb"&gt;`layouts/`&lt;/span&gt;（模板覆盖）、&lt;span class="sb"&gt;`assets/`&lt;/span&gt; 与 &lt;span class="sb"&gt;`static/`&lt;/span&gt;（样式、静态资源）、&lt;span class="sb"&gt;`themes/&amp;lt;主题&amp;gt;/`&lt;/span&gt;（主题源码）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**主题是外部代码（submodule），默认不改它内部文件**&lt;/span&gt;。优先在站点根目录放同名文件覆盖（Hugo 的 lookup order），例如 &lt;span class="sb"&gt;`layouts/partials/footer.html`&lt;/span&gt;。确实必须改主题内部时，先说明代价（升级会被覆盖，或需要 fork）再决定。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**每处改动都是三步**&lt;/span&gt;：读原文 → 把 diff（改什么、为什么、影响哪些页面）给用户看 → 等确认 → 再改。一次只改一处，别攒一堆一起改。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**改完必看**&lt;/span&gt;：&lt;span class="sb"&gt;`preview.ps1`&lt;/span&gt; 让用户在浏览器确认效果；改模板时可用 &lt;span class="sb"&gt;`-Drafts`&lt;/span&gt; 连草稿一起看。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**用户认可后再提交**&lt;/span&gt;：&lt;span class="sb"&gt;`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&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**不可逆操作先备份**&lt;/span&gt;：删内容、换主题、改 &lt;span class="sb"&gt;`baseURL`&lt;/span&gt;、重写 git 历史之前，先复制目录或开新分支。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### 常见排错
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **Pages 404 / 页面不更新**：仓库 &lt;span class="sb"&gt;`Settings → Pages → Source`&lt;/span&gt; 必须是 &lt;span class="sb"&gt;`GitHub Actions`&lt;/span&gt;；&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 与实际域名不一致时由 workflow 的 &lt;span class="sb"&gt;`--baseURL`&lt;/span&gt; 兜底。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **样式没生效**：核对主题的 &lt;span class="sb"&gt;`assets`&lt;/span&gt; / &lt;span class="sb"&gt;`static`&lt;/span&gt; 目录结构，以及 &lt;span class="sb"&gt;`hugo.yaml`&lt;/span&gt; 里的 &lt;span class="sb"&gt;`theme`&lt;/span&gt; 值与 &lt;span class="sb"&gt;`themes/`&lt;/span&gt; 下的目录名是否一致。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **构建失败**：看 Actions 日志；本地 hugo 版本与主题要求不匹配时，用 &lt;span class="sb"&gt;`setup_actions.ps1 -HugoVersion`&lt;/span&gt; 重新生成 workflow。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **CI 里主题目录是空的**：workflow 的 checkout 已带 &lt;span class="sb"&gt;`submodules: recursive`&lt;/span&gt;；若仍为空，确认 &lt;span class="sb"&gt;`.gitmodules`&lt;/span&gt; 已提交进仓库。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **用户站点仓库（&lt;span class="sb"&gt;`&amp;lt;user&amp;gt;.github.io`&lt;/span&gt;）**：&lt;span class="sb"&gt;`baseURL`&lt;/span&gt; 必须是根域名（如 &lt;span class="sb"&gt;`https://mythstraw.github.io/`&lt;/span&gt;）；私有仓库开 Pages 需付费，必须 public。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Hugo 陷阱速查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`T`&lt;/span&gt; / &lt;span class="sb"&gt;`i18n`&lt;/span&gt; 返回值会被 HTML 转义 → 翻译串含 &lt;span class="sb"&gt;`&amp;lt;a&amp;gt;`&lt;/span&gt; 时必须 &lt;span class="sb"&gt;`| safeHTML`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 模板内链接用 &lt;span class="sb"&gt;`.RelPermalink`&lt;/span&gt;；&lt;span class="sb"&gt;`relURL`&lt;/span&gt; 在带语言前缀时会重复加前缀。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 首页 &lt;span class="sb"&gt;`.Title`&lt;/span&gt; 为空 → 判断首页必须用 &lt;span class="sb"&gt;`.IsHome`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; front matter 不写 &lt;span class="sb"&gt;`slug`&lt;/span&gt; 时 Hugo 用**标题**做 URL（中文标题 → 百分号编码）→ 每篇显式写 &lt;span class="sb"&gt;`slug`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`buildFuture=false`&lt;/span&gt;（默认）：&lt;span class="sb"&gt;`date`&lt;/span&gt; 写成未来时间会被整篇跳过。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 用 Docker 跑 hugo 必须把站点子目录挂成工作目录（挂整盘会报 &amp;#34;Unable to locate config file&amp;#34;）。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 脚本清单
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 脚本 | 作用 | 关键参数 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| --- | --- | --- |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`check_env.ps1`&lt;/span&gt; | 只读环境体检 | &lt;span class="sb"&gt;`-Json`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`install_hugo.ps1`&lt;/span&gt; | 安装 hugo（**须用户先选方式**） | &lt;span class="sb"&gt;`-Method Local\|Docker`&lt;/span&gt;、&lt;span class="sb"&gt;`-StartEngine`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`init_site.ps1`&lt;/span&gt; | 新建站点 + git init + 配置 + .gitignore | &lt;span class="sb"&gt;`-SitePath`&lt;/span&gt;、&lt;span class="sb"&gt;`-Title`&lt;/span&gt;、&lt;span class="sb"&gt;`-BaseUrl`&lt;/span&gt;、&lt;span class="sb"&gt;`-LanguageCode`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`install_theme.ps1`&lt;/span&gt; | 装主题并写入 &lt;span class="sb"&gt;`theme:`&lt;/span&gt;（**主题须现场问用户**） | &lt;span class="sb"&gt;`-ThemeName`&lt;/span&gt;、&lt;span class="sb"&gt;`-ThemeRepo`&lt;/span&gt;、&lt;span class="sb"&gt;`-Mode Submodule\|Zip`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`preview.ps1`&lt;/span&gt; | &lt;span class="sb"&gt;`hugo server`&lt;/span&gt; 本地预览 | &lt;span class="sb"&gt;`-Port`&lt;/span&gt;、&lt;span class="sb"&gt;`-Drafts`&lt;/span&gt;、&lt;span class="sb"&gt;`-BindAddress`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`push_github.ps1`&lt;/span&gt; | 提交并推送到 GitHub | &lt;span class="sb"&gt;`-RepoUrl`&lt;/span&gt;、&lt;span class="sb"&gt;`-Branch`&lt;/span&gt;、&lt;span class="sb"&gt;`-Message`&lt;/span&gt;、&lt;span class="sb"&gt;`-Rebase`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`setup_actions.ps1`&lt;/span&gt; | 生成 GitHub Actions 部署 workflow | &lt;span class="sb"&gt;`-HugoVersion`&lt;/span&gt;、&lt;span class="sb"&gt;`-Branch`&lt;/span&gt;、&lt;span class="sb"&gt;`-NoPush`&lt;/span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="-脚本关键片段"&gt;🔧 脚本关键片段&lt;/h3&gt;
&lt;p&gt;为控制篇幅，下面是各脚本的关键部分（真代码节选，&lt;code&gt;# ...&lt;/code&gt; 表示省略；完整脚本见文末下载）。&lt;/p&gt;
&lt;h4 id="scripts_commonps1"&gt;&lt;code&gt;scripts/_common.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;这段是整个技能的核心：&lt;strong&gt;本机装了 hugo 就直接跑，没装但 Docker 引擎在跑就用容器跑&lt;/strong&gt;——两种安装方式共用同一套脚本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 有原生 hugo 就原生跑；没有原生 hugo 但 Docker 引擎在跑，就用容器跑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Invoke-Hugo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;Mandatory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$SitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;Mandatory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="no"&gt;string[]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$HugoArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$MountPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugomods/hugo:exts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;string[]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$ExtraDockerArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cd &amp;#34;{0}&amp;#34;; hugo {1}&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$SitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$HugoArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DRY-RUN: &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 实跑，退出码非 0 就抛错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$MountPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$SitePath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$src&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ConvertTo-PosixPath&lt;/span&gt; &lt;span class="nv"&gt;$mount&lt;/span&gt; &lt;span class="c"&gt;# E:\myblog -&amp;gt; /e/myblog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$dkArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;run&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--rm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$ExtraDockerArgs&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-v&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;${src}&lt;/span&gt;&lt;span class="s2"&gt;:/src&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/src&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$HugoArgs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DRY-RUN: docker &amp;#39;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dkArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 实跑，退出码非 0 就抛错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&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&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptscheck_envps1"&gt;&lt;code&gt;scripts/check_env.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;只读体检，靠&lt;strong&gt;退出码&lt;/strong&gt;把结论告诉 agent：&lt;code&gt;0&lt;/code&gt;=就绪、&lt;code&gt;1&lt;/code&gt;=hugo 缺失、&lt;code&gt;2&lt;/code&gt;=git 缺失、&lt;code&gt;3&lt;/code&gt;=两者都缺。缺 hugo 时打印的是「去问用户选哪种方式」，而不是自己去装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$hugo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt; &lt;span class="c"&gt;# native / docker / none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-GitExe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Test-DockerEngine&lt;/span&gt; &lt;span class="c"&gt;# client / engine / version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# exit code: 0 ready, 1 hugo missing, 2 git missing, 3 both missing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$exitCode&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$missing&lt;/span&gt; &lt;span class="o"&gt;-contains&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NEXT: hugo is missing. Do NOT install silently - ask the user to pick one:&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; A) local install : powershell -NoProfile -File install_hugo.ps1 -Method Local (winget Hugo.Hugo.Extended)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; B) docker install : powershell -NoProfile -File install_hugo.ps1 -Method Docker (needs Docker Desktop running)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinstall_hugops1"&gt;&lt;code&gt;scripts/install_hugo.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;两种安装方式（&lt;code&gt;-Method Local|Docker&lt;/code&gt;），都要求用户先表态。装完自己复检一次，而不是假设成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Method&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Local&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$wgArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;install&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$WingetId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--accept-source-agreements&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--accept-package-agreements&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DRY-RUN: {0} {1}&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$winget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$wgArgs&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$winget&lt;/span&gt; &lt;span class="nv"&gt;@wgArgs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$after&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Write-Output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OK: hugo {0} -&amp;gt; {1}&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# ... 仍不可见时给出提示（下载被墙、需刷新 PATH、或改用 Docker）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Docker 方式：引擎没起时可加 -StartEngine，最多等 240 秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="n"&gt;pull&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$docker&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-rm&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinit_siteps1"&gt;&lt;code&gt;scripts/init_site.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;新建站点前的唯一硬校验：&lt;strong&gt;目标目录必须是空的&lt;/strong&gt;，宁可报错也不碰已有内容。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Test-Path&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$entries&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-ChildItem&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Count&lt;/span&gt; &lt;span class="o"&gt;-gt&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Target directory is not empty: &lt;/span&gt;&lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="s2"&gt;. Pick another path, or clean it up first (refusing to touch existing content).&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-Hugo&lt;/span&gt; &lt;span class="n"&gt;-SitePath&lt;/span&gt; &lt;span class="nv"&gt;$parent&lt;/span&gt; &lt;span class="n"&gt;-MountPath&lt;/span&gt; &lt;span class="nv"&gt;$parent&lt;/span&gt; &lt;span class="n"&gt;-Image&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;-DryRun:&lt;/span&gt;&lt;span class="nv"&gt;$DryRun&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-HugoArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;new&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;site&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$leaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;yaml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 新站点没有需要保留的内容，直接写一份干净的 hugo.yaml（theme: 留到装主题那步再写）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;@&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;baseURL: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BaseUrl&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;languageCode: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LanguageCode&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;title: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Title&lt;/span&gt;&lt;span class="sh"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sh"&gt;&amp;#34;@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$configPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="c"&gt;# UTF-8 无 BOM，避免中文标题乱码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptsinstall_themeps1"&gt;&lt;code&gt;scripts/install_theme.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;默认 &lt;code&gt;git submodule&lt;/code&gt;（主题可后续升级）；&lt;code&gt;github.com&lt;/code&gt; 不可达时不硬顶，改走 &lt;code&gt;-Mode Zip&lt;/code&gt; 从镜像下载。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 先探活：不通就明确告诉用户「加速器没开」或「改用 -Mode Zip」&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$probe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="nb"&gt;ls-remote&lt;/span&gt; &lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt; &lt;span class="n"&gt;HEAD&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cannot reach &lt;/span&gt;&lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="nv"&gt;$ThemeRepo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;themes/&lt;/span&gt;&lt;span class="nv"&gt;$ThemeName&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;submodule&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-init&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# -Mode Zip 分支：下载 + 解压到 themes/&amp;lt;名&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="nv"&gt;$ZipUrl&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="nv"&gt;$tmpZip&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt; &lt;span class="n"&gt;-TimeoutSec&lt;/span&gt; &lt;span class="mf"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Expand-Archive&lt;/span&gt; &lt;span class="n"&gt;-LiteralPath&lt;/span&gt; &lt;span class="nv"&gt;$tmpZip&lt;/span&gt; &lt;span class="n"&gt;-DestinationPath&lt;/span&gt; &lt;span class="nv"&gt;$tmpDir&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 把 theme: 写进配置（已有就替换，没有就追加）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;-match&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(?m)^\s*theme\s*[:=]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$newContent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(?m)^\s*theme\s*[:=].*$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$configPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$newContent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptspreviewps1"&gt;&lt;code&gt;scripts/preview.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;本地预览。Docker 模式下有个坑：容器内得监听 &lt;code&gt;0.0.0.0&lt;/code&gt;，端口只发布到宿主机回环地址，否则外面打不开。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo is not available. Run check_env.ps1, then ask the user to choose Local or Docker install.&amp;#34;&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 容器模式：容器内监听 0.0.0.0，端口发布在宿主机回环地址上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$innerBind&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$BindAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$extra&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$innerBind&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.0.0.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$extra&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{0}:{1}:{1}&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$BindAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$hugoArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--port&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--bind&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$innerBind&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Drafts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$hugoArgs&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-D&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptspush_githubps1"&gt;&lt;code&gt;scripts/push_github.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;三道保险：身份没配不提交、工作区干净不算失败、远端已有提交时&lt;strong&gt;默认中止&lt;/strong&gt;（要显式加 &lt;code&gt;-Rebase&lt;/code&gt;）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 1) git 身份没配就中止，绝不以未知作者提交&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="o"&gt;-or&lt;/span&gt; &lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s1"&gt;&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&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 2) 工作区干净就跳过 commit（不是报错）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="n"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-porcelain&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;commit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 3) 远端已有提交时中止，除非显式 -Rebase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$remoteHeads&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$git&lt;/span&gt; &lt;span class="nb"&gt;ls-remote&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-heads&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$remoteHeads&lt;/span&gt; &lt;span class="o"&gt;-and&lt;/span&gt; &lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$Rebase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Write-Fail&lt;/span&gt; &lt;span class="s2"&gt;&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&gt; &lt;span class="mf"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pull&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--rebase&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-Git&lt;/span&gt; &lt;span class="n"&gt;-GitArgs&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;push&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-u&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-AllowFail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scriptssetup_actionsps1"&gt;&lt;code&gt;scripts/setup_actions.ps1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Hugo 版本不写死：优先用 &lt;code&gt;-HugoVersion&lt;/code&gt;，否则从本地 hugo 或 hugo 容器里探测，保证 CI 用和你本地一致的版本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoStatus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;native&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoVersionFromString&lt;/span&gt; &lt;span class="n"&gt;-Text&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mode&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$raw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Exe&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-rm&lt;/span&gt; &lt;span class="nv"&gt;$Image&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="vm"&gt;$null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-HugoVersionFromString&lt;/span&gt; &lt;span class="n"&gt;-Text&lt;/span&gt; &lt;span class="nv"&gt;$raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 模板里占位，再替换成真实版本号与分支，UTF-8 无 BOM 写出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__HUGO_VERSION__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$HugoVersion&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__BRANCH__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$Branch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Utf8File&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$workflowPath&lt;/span&gt; &lt;span class="n"&gt;-Content&lt;/span&gt; &lt;span class="nv"&gt;$workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 交给 push_github.ps1 提交推送（复用同一套身份/远端/分支保护）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Join-Path&lt;/span&gt; &lt;span class="nv"&gt;$PSScriptRoot&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;push_github.ps1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-SitePath&lt;/span&gt; &lt;span class="nv"&gt;$sitePath&lt;/span&gt; &lt;span class="n"&gt;-RepoUrl&lt;/span&gt; &lt;span class="nv"&gt;$remote&lt;/span&gt; &lt;span class="n"&gt;-Message&lt;/span&gt; &lt;span class="nv"&gt;$Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="-使用方式"&gt;🚀 使用方式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;解压后把整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放进 nanobot 工作区的 &lt;code&gt;skills/&lt;/code&gt; 目录（Windows 下不用 &lt;code&gt;chmod&lt;/code&gt;，PowerShell 脚本直接就能跑）。&lt;/li&gt;
&lt;li&gt;对 nanobot 说：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署新博客&lt;/strong&gt;：“部署 Hugo 博客”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改现有博客&lt;/strong&gt;：“修改 Hugo 页脚”、“添加关于页面”等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nanobot 会自动加载 Skill，按对应流程逐步询问并执行——每个节点都是「先 &lt;code&gt;-DryRun&lt;/code&gt; 给你看命令 → 你确认 → 才真正执行」。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="-下载这个-skill"&gt;📦 下载这个 Skill&lt;/h3&gt;
&lt;p&gt;上面第四节贴的只是节选，完整脚本（7 个脚本 + 公共函数，含全部边界检查、退出码与排错提示）打包在这里：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://mythstraw.github.io/downloads/hugo-blog-manager.zip" target="_blank" rel="noopener noreferrer"&gt;⬇️ 下载 hugo-blog-manager.zip&lt;/a&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下载后解压，把整个 &lt;code&gt;hugo-blog-manager&lt;/code&gt; 文件夹放进 nanobot 工作区的 &lt;code&gt;skills/&lt;/code&gt; 目录，重启会话即可自动加载。&lt;/p&gt;</description></item><item><title>第一篇文章：博客开张</title><link>https://blog.foreveryang.top/p/hello-world/</link><pubDate>Sun, 27 Sep 2026 00:45:00 +0800</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/p/hello-world/</guid><description>&lt;p&gt;博客搭起来了 🎉&lt;/p&gt;
&lt;h2 id="这个站点用什么搭的"&gt;这个站点用什么搭的&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo&lt;/strong&gt;（extended 版）+ &lt;strong&gt;hugo-bearneo&lt;/strong&gt; 主题，构建速度极快，页面很轻&lt;/li&gt;
&lt;li&gt;内容用 Markdown 写，放在 &lt;code&gt;content/blog/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;主题固件是 submodule，升级用 &lt;code&gt;git submodule update --remote&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;推送到 GitHub 后由 GitHub Actions 自动构建并发布到 GitHub Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="怎么写新文章"&gt;怎么写新文章&lt;/h2&gt;
&lt;p&gt;在站点根目录执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new content blog/文章文件名.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者直接复制本文件的表头（front matter），改 &lt;code&gt;title&lt;/code&gt; / &lt;code&gt;date&lt;/code&gt; / &lt;code&gt;tags&lt;/code&gt; 即可。&lt;/p&gt;
&lt;p&gt;Front matter 里常用字段：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;文章标题&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;发布时间（决定排序；写未来时间会当天不显示）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;文章 URL 末段，例如 &lt;code&gt;/p/hello-world/&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;摘要，用于列表页和搜索引擎&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;标签数组&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;draft: true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;标记为草稿，默认不发布&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mermaid: true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;允许本文使用 Mermaid 图表&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; 之前的内容会作为列表页的摘要。&lt;/p&gt;
&lt;h2 id="已开启的功能"&gt;已开启的功能&lt;/h2&gt;
&lt;p&gt;按年份分组的文章列表、标题搜索、文章目录、图片点击放大、外链新窗口打开。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这篇文章可以删掉，或者留着当模板用。&lt;/p&gt;</description></item><item><title>工具推荐</title><link>https://blog.foreveryang.top/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/projects/</guid><description>&lt;h1 id="工具推荐"&gt;工具推荐&lt;/h1&gt;
&lt;p&gt;这里主要推荐一些好用的 AI 小工具，都是我自己在用或者在折腾的，陆续补充。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://topbook.cc/tools/cornell-notes-paper" target="_blank" rel="noopener noreferrer"&gt;随心打印&lt;/a&gt;
&lt;/strong&gt; —— 康奈尔笔记纸在线生成，选好版式直接打印，随手就能用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://koukoukou.cn/local" target="_blank" rel="noopener noreferrer"&gt;免费抠图&lt;/a&gt;
&lt;/strong&gt; —— 在线一键抠图，图片本地处理，不用担心素材外传。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://tinywow.com/" target="_blank" rel="noopener noreferrer"&gt;免费制作工具&lt;/a&gt;
&lt;/strong&gt; —— TinyWow，免费在线小工具的合集：PDF、图片、视频、文字处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://freecompress.com/zh-cn" target="_blank" rel="noopener noreferrer"&gt;压缩工具&lt;/a&gt;
&lt;/strong&gt; —— 在线压缩图片、视频、PDF，不用装软件。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>关于我</title><link>https://blog.foreveryang.top/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/about/</guid><description>&lt;h1 id="关于我"&gt;关于我&lt;/h1&gt;
&lt;p&gt;嗨！这里是 ForeverYang 的博客。&lt;/p&gt;
&lt;p&gt;我是一个家装设计师，也玩 3D 打印，关于科技的一切都感兴趣。&lt;/p&gt;
&lt;p&gt;目前在学习 AI，尝试过 codex、opencode、nanobot、workbuddy，有一些 Python 基础。&lt;/p&gt;
&lt;p&gt;在这里我会以 AI 新手的身份，把我尝试的东西分享出来，希望对大家有所帮助。&lt;/p&gt;
&lt;p&gt;目前，我用 AI 做过 skill，做过一些网页端的 app，做过个人网站，一点点尝试一点点进步。&lt;/p&gt;
&lt;p&gt;除此之外，我的两大爱好是听赵雷 🦔，看海贼 ⚓️。&lt;/p&gt;
&lt;p&gt;在这里，我记录关于科技、关于知识学习，相关的内容。&lt;/p&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;邮箱：mythstraw@msn.com 欢迎来信，或者直接&lt;a href="https://blog.foreveryang.top/index.xml"&gt;订阅 RSS&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>名句库</title><link>https://blog.foreveryang.top/quotes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>mythstraw@msn.com (ForeverYang)</author><guid>https://blog.foreveryang.top/quotes/</guid><description>&lt;h1 id="名句库"&gt;名句库&lt;/h1&gt;
&lt;p&gt;首页每天显示的那一句，就是从下面这些名句里轮换出来的：轮到哪条由&lt;strong&gt;访客本地的日期&lt;/strong&gt;决定
（算法：距 2000-01-01 的天数 mod 名句条数），所以同一天打开看到的是同一条，隔天自动换。&lt;/p&gt;
&lt;p&gt;名句内容单独存放在站点根目录的 &lt;code&gt;data/quotes.yaml&lt;/code&gt;，想加、想删、想改直接编辑那个文件就行——
列表顺序就是轮换顺序，条数变了也不用改别的地方。下面这份清单会自动跟着更新，
带「今天」标记的那条就是此刻首页显示的那句。&lt;/p&gt;




&lt;ol class="quote-list" id="quote-list"&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;千里之行，始于足下。&lt;/span&gt;&lt;span class="q-author"&gt;老子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;学而不思则罔，思而不学则殆。&lt;/span&gt;&lt;span class="q-author"&gt;孔子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;吾生也有涯，而知也无涯。&lt;/span&gt;&lt;span class="q-author"&gt;庄子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;不积跬步，无以至千里。&lt;/span&gt;&lt;span class="q-author"&gt;荀子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;纸上得来终觉浅，绝知此事要躬行。&lt;/span&gt;&lt;span class="q-author"&gt;陆游&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;问渠那得清如许？为有源头活水来。&lt;/span&gt;&lt;span class="q-author"&gt;朱熹&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;博学之，审问之，慎思之，明辨之，笃行之。&lt;/span&gt;&lt;span class="q-author"&gt;《礼记·中庸》&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;温故而知新，可以为师矣。&lt;/span&gt;&lt;span class="q-author"&gt;孔子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;人生如逆旅，我亦是行人。&lt;/span&gt;&lt;span class="q-author"&gt;苏轼&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;玉不琢，不成器；人不学，不知道。&lt;/span&gt;&lt;span class="q-author"&gt;《礼记·学记》&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;天下事有难易乎？为之，则难者亦易矣。&lt;/span&gt;&lt;span class="q-author"&gt;彭端淑《为学》&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;吾日三省吾身。&lt;/span&gt;&lt;span class="q-author"&gt;曾子&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;认识自己的无知，是认识世界最可靠的方法。&lt;/span&gt;&lt;span class="q-author"&gt;蒙田&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;真正的发现之旅，不在于寻找新的风景，而在于拥有新的眼光。&lt;/span&gt;&lt;span class="q-author"&gt;普鲁斯特&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;我们读书，是为了知道自己并不孤单。&lt;/span&gt;&lt;span class="q-author"&gt;C.S.路易斯&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;每一个不曾起舞的日子，都是对生命的辜负。&lt;/span&gt;&lt;span class="q-author"&gt;尼采&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;世界上只有一种真正的英雄主义，就是在认清生活真相之后依然热爱生活。&lt;/span&gt;&lt;span class="q-author"&gt;罗曼·罗兰&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;耐心是一切聪明才智的基础。&lt;/span&gt;&lt;span class="q-author"&gt;柏拉图&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;认识你自己。&lt;/span&gt;&lt;span class="q-author"&gt;德尔斐神庙箴言&lt;/span&gt;
 &lt;/li&gt;
 
 &lt;li&gt;
 &lt;span class="q-text"&gt;你的时间有限，不要浪费时间过别人的生活。&lt;/span&gt;&lt;span class="q-author"&gt;史蒂夫·乔布斯&lt;/span&gt;
 &lt;/li&gt;
 
&lt;/ol&gt;
&lt;style&gt;
 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&gt;
&lt;script&gt;
 (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&gt;

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