1. گو ماڈیولز اور پیکیج انتظام کی بنائیں
گو ماڈیولز گو زبان کے آفیشل پیکج انتظام اور وابستگی ورژن کنٹرول سسٹم ہے، جو گو 1.11 سے متعارف کیا گیا اور گو 1.13 کے بعد یہ وابستگی کا افتراضی انتظام بن گیا۔ گو ماڈیولز ہر پروجیکٹ کو ایک ماڈیول کے طور پر دیکھتا ہے، جس میں پروجیکٹ کی گو کوڈ اور اس پروجیکٹ پر متوقع پیکیجز شامل ہیں۔
کام کا اصول
گو ماڈیولز پروجیکٹ کی وابستگیوں کو go.mod
فائل کے ذریعے منظم کرتا ہے۔ یہ فائل پروجیکٹ کے روٹ ڈائریکٹری میں ہوتی ہے اور تمام ڈائریکٹ وابستگیوں اور ان کے ورژن کا اظہار کرتی ہے۔ ایک ماڈیول میں مختلف پیکیجز ہو سکتے ہیں، اگرچہ عموماً ریپوزٹری ایک ماڈیول ہوتا ہے۔
تعمیر کرنے یا دیگر کمانڈوں کو اجرا کرتے وقت تو شیچ فائل go.mod
فائل موجود نہیں ہونے کی صورت میں، گو ٹول چین ڈیڈ سی کریگا تاکہ جاری کردہ عمل کے لئے ماڈیول کونٹیکسٹ کا انتخاب کر سکے۔ اگر یہ فائل مل جائے، تو یہ فائل کی وابستگی میں موجود معلومات استعمال ہوتی ہیں، ورنہ GOPATH موڈ کے تحت وابستگی کا انتظام ہوتا ہے۔
گو زبان میں کردار
- ورژن کنٹرول: گو ماڈیولز انہیں ڈویلپرز کو مخصوص ورژنز کا استعمال کرنے کی اجازت دیتا ہے، تاکہ کوڈ کی دوبارہ تخلیقیت کو یقینی بنایا جا سکے۔
- پیکیج انتظام: پروجیکٹ کی وابستگیوں اور ان کے ورژنز کو آسانی سے انتظام کرتا ہے۔
-
ماڈیول علیحدگی: مختلف پروجیکٹس ایک ہی پیکیج کے مختلف ورژن کا استعمال کر سکتے ہیں، کیونکہ ہر پروجیکٹ کے لئے اپنی خصوصی
go.mod
فائل ہوتی ہے جو وابستگیوں کا انتظام کرتی ہے۔
پیکیج اور ماڈیول کا انتظام کسی بھی جدید پروگرامنگ زبان کے لئے اہم ہوتا ہے، کیونکہ یہ وابستگی کا انتظام، پیکیج ورژن اپ گریڈ اور نیچے کی پیکیج صارفین کی لئے دوبارہ تخلیق کرنے والی تفصیلات وچوپٹ کرتا ہے۔ گو زبان میں، جب پروجیکٹس اور وابستگی کی مقیاس مستقل طور پر بڑھتی ہے تو، گو ماڈیولز نے وابستگی انتظام کے چیلنجز کو حل کرنے کے لئے ایک ضروری تنظیم فراہم کی ہے۔
2. آپ کا خود کا گو ماڈیول شروع کرنا
ایک نیا گو ماڈیول شروع کرنا بہت ہی آسان ہے۔ آپ اپنے پروجیکٹ کی روٹ ڈائریکٹری میں مندرجہ ذیل کمانڈ کو اجازت دے سکتے ہیں:
go mod init <ماڈیول-کا-نام>
یہاں، <ماڈیول-کا-نام>
عام طور پر کوڈ ریپوزیٹری کا پتہ ہوتا ہے، جیسے github.com/صارف-نام/ریپو
۔
go.mod
فائل کا مقصد
جب go mod init
کمانڈ کامیابی سے اجراء ہوتی ہے، تو فائل go.mod
موجود روٹ ڈائریکٹری میں بنائی جائے گی۔ یہ فائل مندرجہ ذیل کی تعریف کرتی ہے:
- موجودہ ماڈیول کا نام۔
- گو ورژن۔
- ہر پیکیج کے مناسب ورژن کے ساتھ، سب ضروری معلومات۔
go.mod
فائل، گو ماڈیولز کی نظام کا سب سے اہم حصہ ہے، اور یہ خود بخود اپ ڈیٹ ہوتا رہے گا جب بھی وابستگیاں شامل یا ہٹایا جائیں۔
3. گو پیکیجز کی تخلیق اور ڈھانچا بَنانا
3.1 پیکیجز کی تخلیق کی بنیادی باتیں
گو زبان میں، ایک پیکیج وہ ایک مطلوبہ فعالیتوں کا خصوصی سیٹ رکھنے والے متعدد گو سورس فائلوں کا ایک مجموعہ ہوتا ہے، عموماً ایک ہی ڈائریکٹری میں واقع ہوتے ہیں، اور یہ مخصوص کرتا ہے کہ ہر گو فائل کونسے پیکیج کا حصہ ہے۔
ایک نیا پیکیج بنانے کے لئے، آپ کو درج ذیل کام کرنا ہو گا:
- پیکیج کی ڈائریکٹری کو ظاہر کرنے کے لئے ایک فولڈر تخلیق کریں۔
- فولڈر میں
.go
فائلز بنائیں اور فائل کی پہلی لائن پرpackage <پیکیج-کا-نام>
مقرر کریں۔
پیکیج کا نام عموماً ڈائریکٹری کے نام سے متعلق ہوتا ہے لیکن یہ لازمی نہیں ہوتا ہے کہ یہ یکساں ہو۔ پیکیج کا نام مختصر، واضح ہونا چاہئے، اور بہتر ہو گا کہ انڈر اسکور کا استعمال کم ہو۔
3.2 پیکیج ڈھانچہ
آپ کے گو پیکیجز کو منطقی طریقے سے ڈھانچنا ان کی قابل پڑھائی، قابل تحفظ، اور دوبارہ استعمالیت کیلئے اہم ہے۔
- ڈائریکٹری ڈھانچہ: فعالیت کے بنیاد پر ڈائریکٹریز کو حصوں میں تقسیم کریں، جہاں ہر ڈائریکٹری ایک پیکیج کی نمائندگی کرتی ہے۔
-
نامکمل یول کے اصول: ڈائریکٹریز جیسے
_test
عام طور پر ٹیسٹ فائلز،cmd
ڈائریکٹری عام طور پر کمانڈ لائن ایپلیکیشن کے لئے استعمال ہوتی ہے، اورinternal
ڈائریکٹری خصوصی کوڈ شامل ہوتا ہے جو باہری استعمال کے لئے مقصود نہیں ہے۔
/روٹ-ڈائریکٹری
/pkg
/سب-پیکیج1
سب-پیکیج1.go
/سب-پیکیج2
سب-پیکیج2.go
/cmd
main.go // کمانڈ-لائن ایپلیکیشنز کے لئے cmd ڈائریکٹری
/internal
helper.go
یہ ڈھانچنا معلومات کی تشکیل کو واضح طریقے سے ظاہر کرتا ہے اور کوڈ کو منظم، ٹیسٹ، اور کمپائل کرنا آسان بناتا ہے۔ ایسے خوبصورت ڈھانچے سے دوسرے پروجیکٹس کو بہتر طریقے سے درآمد اور استعمال کرنا ممکن ہوتا ہے۔
پیش کردہ ڈھانچے اور نام رکنیات کا اصولوں کا اپنانا دیگر ڈویلپرز کو، کوڈ بیس کی تشکیل جلد سمجھنے میں مدد ملتی ہے، جس سے پیکیج انتظام اور میئرنسز میں بہتری حاصل ہوتی ہے۔
4. پیکیجز کا درآمد اور استعمال
4.1 مقامی پیکیجز کا درآمد
تصور کریں کہ آپ کا پروجیکٹ ساخت یوں ہے:
├── src
│ ├── main.go
│ └── mypackage
│ └── mymodule.go
اس مثال میں، mypackage
ایک اندرونی پیکیج ہے جسے آپ نے بنایا ہے، جس میں ایک فائل mymodule.go
ہے۔ سب سے پہلے یہ یقینی بنائیں کہ mymodule.go
فائل صحیح پیکیج نام دعوت کرتی ہے۔
// mymodule.go
package mypackage
// SomeFunction mypackage کے ایک عوامی فنکشن ہے
func SomeFunction() {
// فنکشن کا عمل
}
اب، اگر ہم main.go
فائل میں mypackage
پیکیج سے SomeFunction
کا استعمال کرنا چاہتے ہیں، تو ہمیں اسے درآمد کرنا ہوگا:
// main.go
package main
import (
"fmt"
"project/src/mypackage"
)
func main() {
mypackage.SomeFunction()
fmt.Println("فنکشن کو بلایا گیا ہے")
}
اوپر سے دی گئی درآمد کرنے کی بیانیہ main.go
فائل میں mypackage
پیکیج کی درآمد کرتی ہے، جو ہمیں اس پیکیج سے فنکشن کو mypackage.SomeFunction
کو بلانے کی اجازت دیتی ہے۔
4.2 بیرونی پیکیجز کا استعمال
جب بھی ہمیں مزید پیچیدہ فعلیات پر عمل کرنا ہوتا ہے، ہم عام طور پر بیرونی پیکیجز پر انحصار کرتے ہیں۔ بیرونی پیکیجز دوسرے ڈویلپرز دوارہ لکھے گئے ہوتے ہیں، جو ہم اپنے پروجیکٹ میں آسانی سے انضمام کرسکتے ہیں۔ بیرونی پیکیجز تلاش کرنے کے لئے آپ godoc.org جیسی ویب سائٹس پر جا سکتے ہیں یا گیت ہب پر تلاش کرسکتے ہیں۔
فرض کریں آپ اپنے پروجیکٹ میں gorilla/mux
کا استعمال کرنا چاہتے ہیں، جو ایک مشہور HTTP درخواست راوٹر لائبریری ہے۔ آپ اسے درآمد کرکے اور استعمال کر سکتے ہیں:
پہلے، go get
کمانڈ کا استعمال کرکے پیکیج کو انسٹال کریں:
go get -u github.com/gorilla/mux
پھر، اپنی کوڈ میں gorilla/mux
کو درآمد کریں اور استعمال کریں:
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter() // ایک راوٹر مواقع بنائیں
// راستہ قواعد شامل کریں
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
w.Write([]byte("gorilla/mux میں خوش آمدید!"))
})
// HTTP سرور شروع کریں
http.ListenAndServe(":8000", r)
}
اوپر دی گئی کوڈ میں ہم gorilla/mux
کو درآمد کرکے ایک HTTP راوٹر بناتے ہیں، روٹ پتھ کے لئے ایک ہینڈلر فنکشن کو تعین کرتے ہیں، اور آخر میں http.ListenAndServe
کا استعمال کرکے پورٹ 8000 پر سرور شروع کرتے ہیں۔
5. ماڈیول کے انحصارات کا انتظام
ایک بڑے سکیل کے پروجیکٹ میں، ماڈیول کے انحصارات کا انتظام بہت اہم ہوتا ہے۔ یہ یقینی بناتا ہے کہ ہر بلڈ یا پروجیکٹ کا نقلیہ بالکل ٹھیک طریقے سے انحصارات کے یکساں ورژن استعمال کرسکتا ہے۔
5.1 go get
کے ذریعے انحصارات کا اپ ڈیٹ
go get
کمانڈ نہ صرف نئے پیکیج کے انحصارات شامل کرسکتی ہے بلکہ موجودہ انحصارات کو بھی اپ ڈیٹ کرسکتی ہے۔ نیچے go get
کے کچھ عام آپشنز ہیں:
- ایک ہی پیکیج کا اپ ڈیٹ:
go get -u github.com/some/package
- اس پیکیج کے تمام انحصارات کو اپ ڈیٹ کریں:
go get -u github.com/some/package/...
- پروجیکٹ میں تمام انحصارات کو اپ ڈیٹ کریں:
go get -u ./...
- ڈاؤن لوڈ کریں لیکن انسٹال نہ کریں:
go get -d github.com/some/package
اپ ڈیٹ تھات، گو نے انحصارات کو آخری نکتہ یا ترمیم ورژن (سیمانٹک ورژننگ کے مبنی) تک اپ ڈیٹ کریں گے، اور تبدیلیاں go.mod
فائل میں بھی نظر آئیں گی۔
ورژن کنٹرول اور go.mod
5.2
گو نے ورژن 1.11 سے، ایک نیا وابستگی کا منتظم نظام جو Go Modules
کہلاتا ہے فراہم کیا ہے۔ پروجیکٹ کی روٹ ڈائرکٹری میں، go.mod
فائل نے پیکیجز کی وابستگیوں کی سرگرمیوں کو ریکارڈ کیا ہے۔
go.mod
فائل نشان دہی کرتی ہے:
- ماڈیول موجودہ پروجیکٹ کے ماڈیول پانتھ کے لیے راستہ بتاتا ہے۔
- ضروری وابستگیاں اور ان کے مخصوص ورژنز کا بیان کرتا ہے۔
- تبدیلی وہ ایشیا جہیں تبدیلی کے ماڈیوٹ پائی جاتی ہیں۔
- مستثنی نسخے کو خارج کرنے کے لئے استعمال کیا جاتا ہے۔
go.mod
فائل کا مثال اس طرح کی ہو سکتی ہے:
module github.com/my/awesome-project
go 1.14
require (
github.com/gorilla/mux v1.7.4
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975
)
replace (
github.com/old/dependency => github.com/new/dependency v1.2.3
)
exclude (
github.com/old/dependency v1.1.4
)
پروجیکٹ میں go build
یا go test
جیسے کمانڈز کو چلاتے وقت، گو خود با خود go.mod
فائل کو اپ ڈیٹ کر کے پروجیکٹ کے لئے ضرورت مند وابستگیاں تعین کرتی ہے۔ویسٹ پریکٹس میں ورژن کنٹرول کرنا ہوتا ہے کہ go.mod
اور go.sum
فائلز (جو وابستگیوں کے متوقع کرپٹو ہیش کا ریکارڈ کرتی ہے) کو با انتظام کمٹ کیا جائے۔
go.mod
فائل کو منظم کر کے، یہ یقینی بنایا جاتا ہے کہ ٹیم کے ہر ڈویلپر، یکساں وابستگی کے ورژنز کا استعمال کرتا ہے، اس طرح "میرے کمپیوٹر پر چلتا ہے" کی ناپسندیدہ صورتحال سے بچا جا سکتا ہے۔