paint-brush
गो प्रोजेक्ट में स्थैतिक संसाधनों को कैसे एम्बेड करेंद्वारा@kibizovd
835 रीडिंग
835 रीडिंग

गो प्रोजेक्ट में स्थैतिक संसाधनों को कैसे एम्बेड करें

द्वारा David Kibizov3m2023/11/28
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

स्टैंडअलोन एप्लिकेशन का उपयोग करना तैनाती और वितरण को सरल बनाता है क्योंकि यह सिर्फ एक निष्पादन योग्य बाइनरी है। गो एप्लिकेशन में संसाधनों को एम्बेड करने के लिए राइस, स्टेटिक और बिंदाटा सभी उपलब्ध हैं। आइए एक Index.html टेम्प्लेट बनाएं और गो कोड का परीक्षण करने के लिए इसे एक स्थिर संसाधन के साथ परीक्षण करें।
featured image - गो प्रोजेक्ट में स्थैतिक संसाधनों को कैसे एम्बेड करें
David Kibizov HackerNoon profile picture

मैं गो में एक छोटा स्टैंडअलोन वेब एप्लिकेशन बनाना चाहता था, जो एक नियमित वेब एप्लिकेशन के विपरीत था जहां संसाधनों को सीडीएन या HTTP सर्वर जैसे कि Nginx के माध्यम से अलग से परोसा जाएगा।


हालाँकि, यदि प्रदर्शन कोई गंभीर चिंता का विषय नहीं है या एप्लिकेशन कम ट्रैफ़िक के लिए है, तो स्टैंडअलोन एप्लिकेशन का उपयोग तैनाती और वितरण को सरल बनाता है क्योंकि यह सिर्फ एक निष्पादन योग्य बाइनरी है।


गो एप्लिकेशन में संसाधनों को एम्बेड करने के लिए कई पैकेज उपलब्ध हैं:



मैं प्रत्येक लाइब्रेरी की बारीकियों में नहीं जाऊंगा, लेकिन इसके उपयोग में आसानी और सक्रिय समर्थन के कारण मैं बिंदाटा दृष्टिकोण को प्राथमिकता देता हूं।

शुरू करना

सबसे पहले, आइए अपने प्रोजेक्ट में frontend/ डायरेक्टरी के अंदर एक index.html बनाएं:

 <html> <body> Hello, World! </body> </html>


अब जबकि हमारे पास परीक्षण के लिए एक प्रोजेक्ट सेटअप और एक स्थिर संसाधन है, आइए कमांड का उपयोग करके बाइंडटा इंस्टॉल करें:

 go get -u github.com/jteeuwen/go-bindata/...


हम वेब एप्लिकेशन का बैकएंड कोड चलाने के लिए तैयार हैं। एक main.go फ़ाइल बनाएं और निम्नलिखित कोड कॉपी करें:

 package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) }


इस कोड में महत्वपूर्ण पंक्ति:

 //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/...


जब go generate कहा जाता है तो उपरोक्त पंक्ति हमें go-bindata कमांड चलाने की अनुमति देती है। संस्करण 1.4 के अनुसार, आप जनरेशन चरण के दौरान कस्टम कमांड चला सकते हैं। यह केवल आपकी गो फ़ाइल में //go:generate command argument... जोड़ने की बात है।


go-bindata कमांड लाइन में कई पैरामीटर हैं, इसलिए इसका उपयोग करने के तरीके पर दस्तावेज़ की जाँच करें। हमारे मामले में, हम कहते हैं:


  • -prefix "frontend/" स्थैतिक के लिए पथनाम के भाग को परिभाषित करता है


  • -pkg main जेनरेट कोड में प्रयुक्त पैकेज नाम को परिभाषित करता है


  • -o bindata.go जेनरेट की गई फ़ाइल का नाम परिभाषित करें


go generate कमांड चलाने के बाद, आपको bindata.go नाम की एक जेनरेट की गई फ़ाइल देखनी चाहिए। आपके प्रोजेक्ट की संरचना इस तरह दिखनी चाहिए:

 . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go


स्थैतिक फ़ाइलों को प्रस्तुत करने का तर्क static_handler फ़ंक्शन में है, जो अनुरोध प्राप्त करता है और जाँचता है कि पथ स्थैतिक पथ से मेल खाता है या नहीं। चेक Asset फ़ंक्शन का उपयोग करके किया जाता है, जो स्वचालित रूप से bindata.go उपयोगकर्ता द्वारा निर्यात किया जाता है। यदि संसाधन मौजूद नहीं है, तो हम 404 लौटाते हैं, अन्यथा, हम संसाधन की सामग्री लौटाते हैं।


बाकी कोड वेब एप्लिकेशन बनाने और / के लिए आने वाले सभी अनुरोधों से मेल खाने के लिए हमारे static_handler टेम्पलेट को बाइंड करने के लिए है। यदि आपको इस कोड को समझने में परेशानी हो रही है, तो http package के लिए आधिकारिक गो दस्तावेज़ देखें।


गो पैकेजों को कैसे संभालता है, इसकी एक त्वरित अनुस्मारक के रूप में, यदि पहचानकर्ता नाम का पहला अक्षर बड़े अक्षर से शुरू होता है तो सभी पहचानकर्ता स्वचालित रूप से उसी नाम के साथ अन्य पैकेजों में निर्यात किए जाएंगे।


इस नियम के आधार पर, bindata.go फ़ाइल main पैकेज के लिए Asset फ़ंक्शन प्रदान करती है। यह दिए गए नाम के लिए एक परिसंपत्ति को लोड और लौटाता है। यदि संसाधन नहीं मिल पाता है या लोड नहीं किया जा सकता है तो यह एक त्रुटि देता है।