আমি গো-তে একটি ছোট স্বতন্ত্র ওয়েব অ্যাপ্লিকেশন তৈরি করতে চেয়েছিলাম, একটি নিয়মিত ওয়েব অ্যাপ্লিকেশনের বিপরীত যেখানে সম্পদগুলি আলাদাভাবে একটি CDN বা HTTP সার্ভার যেমন Nginx এর মাধ্যমে পরিবেশন করা হবে।
যাইহোক, যদি কর্মক্ষমতা একটি সমালোচনামূলক উদ্বেগ না হয় বা অ্যাপ্লিকেশনটি কম ট্রাফিকের জন্য উদ্দেশ্যে করা হয়, একটি স্বতন্ত্র অ্যাপ্লিকেশন ব্যবহার করে স্থাপনা এবং বিতরণ সহজ করে কারণ এটি শুধুমাত্র একটি এক্সিকিউটেবল বাইনারি।
একটি Go অ্যাপ্লিকেশনে সংস্থান এমবেড করার জন্য বেশ কয়েকটি প্যাকেজ উপলব্ধ:
আমি প্রতিটি লাইব্রেরির সুনির্দিষ্ট বিষয়ে অনুসন্ধান করব না, তবে আমি এর ব্যবহার সহজ এবং সক্রিয় সমর্থনের কারণে বিন্ডাটা পদ্ধতি পছন্দ করি।
প্রথমে, আপনার প্রজেক্টের frontend/
ডিরেক্টরির ভিতরে একটি index.html
তৈরি করি:
<html> <body> Hello, World! </body> </html>
এখন যেহেতু আমাদের কাছে একটি প্রজেক্ট সেটআপ আছে এবং পরীক্ষা করার জন্য একটি স্ট্যাটিক রিসোর্স আছে, আসুন কমান্ডটি ব্যবহার করে bindata ইনস্টল করি:
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-bindata
কমান্ড চালানোর অনুমতি দেয় যখন go generate
বলা হয়। সংস্করণ 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
জন্য অফিসিয়াল Go ডকুমেন্টেশন দেখুন।
গো কীভাবে প্যাকেজগুলি পরিচালনা করে তার একটি দ্রুত অনুস্মারক হিসাবে, শনাক্তকারীর নামের প্রথম অক্ষরটি বড় অক্ষর দিয়ে শুরু হলে সমস্ত শনাক্তকারী স্বয়ংক্রিয়ভাবে একই নামের অন্যান্য প্যাকেজে রপ্তানি হবে৷
এই নিয়মের উপর ভিত্তি করে, bindata.go
ফাইলটি main
প্যাকেজের জন্য Asset
ফাংশন প্রদান করে। এটি প্রদত্ত নামের জন্য একটি সম্পদ লোড করে এবং ফেরত দেয়। রিসোর্স পাওয়া না গেলে বা লোড করা না গেলে এটি একটি ত্রুটি প্রদান করে।