मैं गो में एक छोटा स्टैंडअलोन वेब एप्लिकेशन बनाना चाहता था, जो एक नियमित वेब एप्लिकेशन के विपरीत था जहां संसाधनों को सीडीएन या 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
फ़ंक्शन प्रदान करती है। यह दिए गए नाम के लिए एक परिसंपत्ति को लोड और लौटाता है। यदि संसाधन नहीं मिल पाता है या लोड नहीं किया जा सकता है तो यह एक त्रुटि देता है।