从Hexo到Hugo

从Hexo到Hugo 背景 促使我从WordPress搬迁到Hexo,再决定从Hexo搬迁到Hugo的动机是:想尽可能简化写博客的流程,减少除文章撰写以外一切无关事务的精力消耗。 这一追求源于我对自身的观察。一天的精力里往往绝大部分都投入在工作之上,在闲暇中再挤出时间投入写作对意志力是个考验。以往使用WordPress时,一旦VPS的访问速度不佳,那登录后台、打开编辑器、调整样式过程中等待耗费的时间,就足以将不多的意志力消磨干净。 后续切到Hexo+Github Pages后,不得不说,这让博客的发布顺畅不少,不再需要登录后台,几乎不需要考虑排版,迁移站点时也不再有数据库的顾虑。唯一的麻烦是,每次修改文件后,需要调用Hexo CLI重新生成站点并推送到Github Pages仓库。这也意味着本地总得准备一份Node.js环境。思考一番后,前面通过使用Github Actions部署Hexo把生成和部署也自动化了,只需要写文章并推送即可。 这么愉快地用了些时日,但在和Obsidian的配合使用中,又发现了新的矛盾: Hexo如果需要用相对路径引用图片,图片应置于文章同名的文件夹下。而在Obsidian中,我所采取的方式是图片集中放置于media目录下 笔记现在总是用Obsidian创建,但需要为Hexo复制一份需要发布的文章及资源,而重复总是不利于维护的 如果将Hexo仓库置于Obsidian Vault中,再将需要发布的文章直接放到Hexo仓库的posts目录下,虽然不用复制文章,但Obsidian Vault中会带入Hexo/Node.js相关的文件。这些文件和笔记无关,在整理笔记时无异于噪音 这些问题都可以通过修改笔记来迁就Hexo,但这就是前文所说的,文章撰写以外的事务。我现在相信:应当让博客工具迁就写作习惯,而不是调整写作习惯来适应工具。 方法 为解决以上矛盾,想到的方法是: 在Vault中新建一个文件夹(这里记作Publish),在其中初始化Git仓库,存放供发布的文章 新建一个静态站点文件夹,同样初始话Git仓库,Publish仓库作为Git子模块加入其中 静态站点生成器应支持相对路径,且对文件夹的名称无要求 这样Obsidian Vault中只需要存放笔记,至于静态站点生成相关的内容则不再其中。为了方便博客发布的流程,还应该做到: 推送静态站点仓库时,应自动生成和部署站点,免去本地生成站点的麻烦 在Publish仓库中推送时,应自动更新静态站点仓库,让子模块引用Publish仓库的最新提交,免去需要在两个仓库中提交和推送的麻烦 做到这些后,应当可以: 不需要为了发布而改变记录笔记的方式 只维护一份需发布的资源 只需推送文章到远端,站点即能自动更新,本地不需要配置环境或手动生成站点 本想看看有没有办法让Hexo支持任意文件夹名的相对路径,但惊讶地发现并没有轻松的方式实现(我原以为这是非常常见的需求)。Gatsby/Jekyll/Hugo等一众工具也不原生支持此需求,这似乎与文件名到URL的映射有关。不过 GitHub - zoni/obsidian-export: Rust library and CLI to export an Obsidian vault to regular Markdown 提供了一个解决方式,遂决定切换到Hugo。 实施 支持相对路径 在Obsidian Vault中新建一个文件夹(这里记为Publish),在其中初始化Git仓库,存放供发布的文章。在Github上创建远端仓库并推送 用hugo new site命令创建站点文件夹(这里记为Site),同样初始化Git仓库。在Github上创建xxx.github.io名称的仓库并推送 与Hexo一样,Hugo同样支持主题,这里选用了PaperMod | Hugo Themes 在主题的layouts/_default/_markup/render-image.html中(若无该文件则新建),加入以下代码片段以支持相对路径引用图片: {{- $url := urls.Parse .Destination -}} {{- $scheme := $url.Scheme -}} <a href=" {{- if eq $scheme "" -}} {{- if strings....

2023-04-06 · Qiao

使用Github Actions部署Hexo

切换到Hexo写博客后,每次换电脑都要来遍NodeJS、Hexo的配置。虽然不算困难,但挺消耗写文章的心情,故决定折腾下Github CI,实现写完文章后推送就自动完成Hexo的生成和部署,这样方便专注于文章的撰写,不被环境搭建分散精力。 设置仓库 准备两个仓库,一个为博客源码仓库,一个是静态页面仓库。 博客源码仓库:名称任意,设为私有 静态页面仓库:名称需按照xxx.github.io格式来,必须设为公开的,存放Hexo生成的内容。参考https://pages.github.com/ 设置密钥 为了向静态页面仓库推送内容,需要添加一对SSH密钥,其中公钥设置到静态页面仓库,私钥设置到源码仓库。 生成密钥 ssh-keygen -t ed25519 -C "your_email@example.com" 在Github的静态仓库页面,添加新的Deploy Key。在Settings -> Deploy keys -> Add new中,填入任意Title,Value则是新生成的公钥内容。由于要往此仓库推送,需勾选”Allow Write Access“。 在Github的源码仓库页面,在Settings -> Secrets -> Actions中点击New repository secret,Name设置为DEPLOY_KEY(后面配置Github Actions的脚本时会用NAME索引到此secret),Value填入新生成私钥的内容 定义Workflows 在源码仓库根目录下,创建.github/workflows/hexo_deploy.yml文件,内容如下: name: HEXO_DEPLOY on: push: branches: - master jobs: build: runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v2.5.0 with: ref: master submodules: 'true' - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 18 - name: Setup hexo env: ACTION_DEPLOY_KEY: ${{ secrets....

2022-12-10 · Qiao