前言

由于我在构建 Hexo+Obsidian 写作工作流时,采用的是 hexo 项目单独存放,只将 _posts 目录通过 ln -s 软链接方式挂载到 obsidian 中,因此网上的各种工作流方案都不适合:

  • Hexo + Obsidian + Git 完美的博客部署与编辑方案 所说的,对 hexo 项目新建 vault,使用 Obsidian Git 插件管理推送、发布等任务。此种方案我有两个原因拒绝,一是我不希望把博客写作分离出我的常用 vault,二是我要保证绝不引入诸如 node_modules.git 等多文件目录来污染 obsidian 的索引和效率。
  • 在 obsidian 中写作,利用 terminal 或者 vscode 单独进行推送和发布任务,适合前期建站期间需要大量调试,使用 vscode 进行编辑是方便的。后期稳定后,追求的是写作内容,工作流相对稳定,所以尽可能的在一个 app 中完成全部流程是最好的。
  • obsidian 中的 Hexo Auto Updater 插件基本原理也是通过软链接挂载,但是挂载整盘后让用户选择 hexo 项目目录,然后在 obsidian 中发现文章有改动便会自动触发推送。但我在试用的时候在挂载全盘后的权限请求和索引重建过程让 obsidian 直接卡死,不得已从插件目录中删除后,重启 obsidian 才行。另一点,文章改动就触发自动推送有点过于频繁了,还没有选项可调,我的发布服务使用的 cloudflare,并不想如此频繁的发布。这种方案问题太多,不推荐使用。
  • 另一种方案 在Obsidian中写Hexo Blog 采用的是 rsync 来同步 obsidian 和 hexo 的文章,这样做的问题是可能会遇到版本冲突(两边修改,忘记同步)、文件丢失(带着 --delete 可能会导致意外)、磁盘重复占用等问题,而我采用的软链接方式,完美避开这几种问题。虽然该篇文章中同步方案不适合,但是提到的一个插件给了我灵感,Shell Commands 可以在 obsidian 中执行脚本,完美避开了 Hexo Auto Updater 插件挂载全盘后选择目录的巨大问题。但是要注意不要按这篇文章进行插件设置,因为版本太老,改动了许多内容,请以我下面文中描述进行配置。
最终方案

使用 Obsidian 插件 Shell Commands 配合自己写脚本,来实现在 obsidian 中完成预览、推送流程。
进而打通了只在 obsidian 中就可以完成从写作到发布的透明化流程,完全不用手动同步文章、切换 vault、手动执行 hexo 命令、手动 git 等。

具体步骤

安装 Shell Commands 插件

打开 obsidian 设置 ->第三方插件 -> 浏览 -> 输入 Shell commands -> 安装启用 -> 选项。我现在的安装版本是 0.22.0

配置 Shell Commands 插件

配置环境变量

由于通过该插件启动的是个只带有少量默认 PATH 的虚拟 shell,因此在执行 hexo server 时,可能会提示 command not found,因此需要将本机中的环境变量加入到插件的环境变量中,具体步骤如下:

  1. 先查询本机环境变量: echo $PATH,复制输出的内容。
  2. 打开插件设置,选择 Environments,将内容粘贴到下方对应本机系统的 additions 中。

CleanShot 2024-08-18 at 02.20.08@2x.png

配置脚本

打开插件设置,选择 Shell Commands 选项卡,点击 New Shell Command,依次填写下面脚本命令,可以通过右侧齿轮图标修改 Aliase 名称。我这里一共写了三个脚本,分别是:

  • hexo-preview 预览:相当于执行 hexo server 后自动打开网页。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 请自行修改Hexo项目目录
PROJECT_DIR="/Users/jzl/blog"
PORT=4000

# 切换到项目目录
cd "$PROJECT_DIR" || { echo "Failed to navigate to $PROJECT_DIR"; exit 1; }

# 清理生成的文件并启动Hexo服务器
hexo clean
kill -9 $(lsof -t -i:$PORT) 2>/dev/null
hexo server &

# 等待服务器启动
while ! curl -s http://localhost:4000 > /dev/null; do
  sleep 1
done

# 打开浏览器
open "http://localhost:$PORT"
  • hexo-stop 停止 server:提供一个手动停止 hexo 服务器的功能。
1
2
3
4
#!/bin/bash

PORT=4000
kill -9 $(lsof -t -i:$PORT) 2>/dev/null
  • hexo-deploy 发布:相当于 git push 功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# 请自行修改_posts目录
PROJECT_DIR="/Users/jzl/blog/source/_posts/"
PORT=4000

cd "$PROJECT_DIR" || { echo "Failed to navigate to $PROJECT_DIR"; exit 1; }

# 清理生成的文件并启动Hexo服务器
hexo clean
kill -9 $(lsof -t -i:$PORT) 2>/dev/null

git add .
git commit -m "commit from obsidian"
git push origin main

至此配置完成,如图所示:

CleanShot 2024-08-18 at 02.37.43@2x.png

使用

呼出 obsidian 的命令行,输入 hexo-preview,执行命令。