inotifywait का उपयोग करके स्थैतिक साइट SSG LumeCMS में केवल तभी पुनः बिल्ड करें जब कोई परिवर्तन हो

7 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
अब, सार्वजनिक पृष्ठों के लिए, यदि बिल्ड डायरेक्टरी को अलग रखा जाता है, तो रियल-टाइम में बदलाव होने पर भी यह तुरंत बिल्ड नहीं होता है। और बिल्ड को क्रॉन जॉब बनाना भी संसाधनों और डिस्क के अनावश्यक उपयोग के कारण बचा जाना चाहिए। इसलिए, मैं एक स्क्रिप्ट बनाऊंगा जो 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 सर्वर शुरू करने में झिझक थी, इसलिए मैंने site डायरेक्टरी को, जो एडमिन पेज CMS के अलावा है, Apache की तरफ से सुना और इसे Nginx, जो सार्वजनिक सर्वर है, के माध्यम से Apache पर रिवर्स प्रॉक्सी करके प्रकाशित किया। तो, फिर मिलेंगे। धन्यवाद।

Related Posts