使用inotifywait仅在LumeCMS(静态网站SSG)发生更改时才重新构建
大家好,我是无能。今天我完全迁移到了LumeCMS。因此,我将记录这次迁移的过程。
管理页面的分离
对于LumeCMS,管理页面和普通页面是不同的。例如,如果使用标准设置运行`deno task lume cms`和`deno task serve`,两者都会被构建到默认的`_site`文件夹中。在这种情况下,当编辑管理页面时,它会实时构建到`_site`,并且将“Draft”设置为“Yes”的非公开页面也会一起构建。如果以`_site`作为根目录启动HTTP服务器,那么甚至非公开文章也会变得可见。这必须避免。因此,我的做法是:
/home/haturatu/.deno/bin/deno task lume cms --location=http://localhost:3001
我首先在localhost的3001端口将其设置为CMS用途。然后,为了能够从外部进行编辑,我在Nginx端使用一个临时域名对http://localhost:3001进行了反向代理。这样就完成了管理页面。
接下来是公开页面,如果构建目录是分开的,那么实时更改并不会立即触发构建。然而,将构建设置为cron作业只会浪费资源和磁盘损耗,这是我希望避免的。因此,我将创建一个脚本,使用inotify-tools(inotifywait)来监控文件系统,并在检测到更改时执行指定的命令。
#!/bin/bash
WATCHED_DIR="/var/www/html/soulmining/src/" # 监控的目录
COMMAND="/home/haturatu/.deno/bin/deno task lume --dest=site" # 执行命令 --dest 指定构建输出目的地
COOLDOWN_TIME=60 # 冷却时间(秒)
# 记录上次执行命令的时间
LAST_RUN_FILE="/tmp/last_run.time"
# 获取当前时间
current_time() {
date +%s
}
# 获取上次执行命令的时间(如果不存在则返回0)
get_last_run_time() {
if [ -f "$LAST_RUN_FILE" ]; then
cat "$LAST_RUN_FILE"
else
echo 0
fi
}
# 记录上次执行命令的时间
set_last_run_time() {
current_time > "$LAST_RUN_FILE"
}
inotifywait -m -r -e modify,create,delete "$WATCHED_DIR" | while read -r directory events filename; do
echo "检测到更改"
last_run_time=$(get_last_run_time)
now=$(current_time)
# 根据上次执行命令的时间判断是否再次执行命令
if [ $((now - last_run_time)) -ge $COOLDOWN_TIME ]; then
echo "执行命令"
cd /var/www/html/soulmining || exit
$COMMAND
cd ~ || exit
set_last_run_time
else
echo "命令未执行"
fi
done
如果能够实际确认其运行正常,那么在后台运行时,`echo`语句是多余的,可以将其注释掉。此外,我添加了冷却时间,因为如果不这样做,命令会针对每个更改的文件(包括vim的交换文件等)执行。虽然也可以选择要排除的文件,但我认为这种方式更简单,并且能够可靠地捕获更改,所以采用了这种设计。创建一个名为chreload.sh的文件,并使用nohup sudo -u root chreload.sh &执行。将其添加到`rc.local`中,例如/my/dir/chreload.sh &。`src`目录主要是修改文章和CSS文件的目录,因此检测到该目录的更改应该就足够了。另外,还需要更改的是Hugo中所谓的`baseUrl`,默认情况下它仍然是`localhost`,因此必须进行适当的设置。
$ cat _config.ts
import lume from "lume/mod.ts";
import blog from "blog/mod.ts";
import plugins from "./plugins.ts";
import nunjucks from "lume/plugins/nunjucks.ts";
import basePath from "lume/plugins/base_path.ts";
const site = lume({
src: "./src",
location: new URL("https://soulminingrig.com"),
});
site.use(basePath());
site.use(plugins());
site.use(nunjucks());
export default site;
因此,我现在可以毫无问题地发布它了。此外,由于我不太愿意使用Deno启动HTTP服务器,所以我让Apache监听site目录(即除了作为管理页面的CMS之外的部分),然后使用作为公共服务器的Nginx反向代理到Apache进行发布。那么,下次再见。请多关照。