使用inotifywait僅在靜態網站SSG LumeCMS有變更時重新建置

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伺服器有所顧慮,因此我將除了管理頁面(CMS)之外的site目錄在Apache端進行監聽,並通過作為公開伺服器的Nginx反向代理到Apache進行發布。那麼,下次再見。請多關照。

Related Posts