ماڈیول اسباق (4/5)
ماڈیولز پر جائیں۔
A Go ماڈیول ایک قابل ورژن یونٹ ہے جو ایک یا زیادہ پیکجوں پر مشتمل ہے۔ یہ جدید انحصاری نظام کی بنیاد ہے (Go 1.11+): مزید نہیں GOPATH، مزید لازمی نہیں vendor، واضح اور تولیدی انحصار۔
go.mod: ماڈیول مینی فیسٹ
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
تین اہم ہدایات:
module <path>— ماڈیول کا درآمدی راستہ۔ تمام داخلی پیکیجزexample.com/myapp/sub/pkgکے بطور درآمد کیے گئے ہیں۔ اس کا حقیقی URL ہونا ضروری نہیں ہے، لیکنgo getکے ذریعے شائع کرنے کے لیے اسے حل کرنا ضروری ہے۔go <version>— کم از کم Go ورژن درکار ہے (یہ کنٹرول کرنے کے لیے بھی استعمال کیا جاتا ہے کہ کن زبان کی خصوصیات کی اجازت ہے، جیسے کہ 1.23 میں رینج اوور فنک)۔require— براہ راست انحصار اپنے درست ورژن کے ساتھ۔
دیگر ہدایات: replace (کانٹے یا مقامی راستے کے ساتھ ڈیپ کا متبادل)، exclude، retract۔
go.sum: کرپٹوگرافک لاک فائل
go.mod کے ساتھ، go.sum ہر ڈاؤن لوڈ کردہ ورژن کی ایک کرپٹوگرافک ہیش پر مشتمل ہے (بشمول عبوری انحصار)۔ یہ ** تولیدی صلاحیت** کی ضمانت دیتا ہے: اگر کوئی شائع شدہ ورژن کے ساتھ چھیڑ چھاڑ کرتا ہے تو تعمیر ناکام ہوجاتی ہے۔
ہمیشہ اس کا ارتکاب کریں۔ یہ خود بخود go کمانڈز کے ذریعہ اپ ڈیٹ ہوجاتا ہے۔
ضروری احکام
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy وہ ہے جسے آپ درآمدات میں ہر تبدیلی کے بعد چلاتے ہیں: یہ اس بات کی ضمانت دیتا ہے کہ go.mod اصل میں استعمال شدہ پیکیجز کی بالکل عکاسی کرتا ہے۔
سیمنٹک امپورٹ ورژننگ (SIV)
ورژنز SemVer کی پیروی کرتے ہیں: v1.2.3 = MAJOR.MINOR.PATCH۔ دلچسپ حصہ ** میجر v2+** ہے:
- میجر
v0اورv1→ عام راستہ:github.com/foo/bar۔ - میجر
v2یا بعد کا → راستہ بڑا ورژن شامل ہے:github.com/foo/bar/v2۔
import "github.com/foo/bar/v2"یہ آپ کو ایک ہی لائبریری کے v1 اور v2 دونوں کو ایک ہی وقت میں درآمد کرنے دیتا ہے (ترقی پسند منتقلی کے دوران مفید)۔
راستے اور اندرونی پیکجز درآمد کریں۔
اگر آپ کا ماڈیول example.com/myapp ہے، تو ایک utils/ ذیلی فولڈر اس طرح درآمد کیا جاتا ہے:
import "example.com/myapp/utils"راستہ صرف go.mod میں اعلان کردہ نام پر منحصر ہے، ڈسک پر موجود مقام پر نہیں: ایک مختلف فولڈر میں ایک ہی کوڈ کام کرتا رہتا ہے۔
ورک اسپیس موڈ (1.18+ پر جائیں)
متعدد ماڈیولز پر کام کرنے کے لیے جو ایک ہی وقت میں ایک دوسرے کا حوالہ دیتے ہیں (مثال کے طور پر لائبریری اور ایک ایپ جو اسے استعمال کرتی ہے):
go work init ./lib ./appیہ go.work بناتا ہے: go build شائع شدہ کو ڈاؤن لوڈ کرنے کے بجائے ./lib کا مقامی ورژن استعمال کرے گا۔ اس کا ارتکاب نہ کریں go.work (یہ ایک ترقیاتی ماحول ہے)۔
مشقیں
ماڈیول example.com/myapp ہے اور اس میں utils ذیلی فولڈر ہے۔ مکمل راستے کا استعمال کرتے ہوئے مین میں ذیلی پیکیج درآمد کریں۔
اشارہ دکھائیں۔
درآمدی راستہ ماڈیول کا نام ہے (go.mod سے) اور فولڈر کا رشتہ دار راستہ۔
3 کوششوں کے بعد حل دستیاب ہے۔
fmt اور os دونوں کو درآمد کرتے ہوئے، درآمد (... ) نحو کے ساتھ انفرادی درآمدات کو ایک درآمدی گروپ میں تبدیل کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
کون سی کمانڈ انحصار کو ہٹاتی ہے جو اب go.mod سے درآمد نہیں کی گئی ہیں اور گمشدہ کو شامل کرتی ہے؟
$ go mod ???