使用inotifywait仅在LumeCMS(静态网站SSG)发生更改时才重新构建

4 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是无能。今天我完全迁移到了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进行了反向代理。这样就完成了管理页面。Image
接下来是公开页面,如果构建目录是分开的,那么实时更改并不会立即触发构建。然而,将构建设置为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进行发布。那么,下次再见。请多关照。

Related Posts