package.json بمقابلہ go.mod: ورژن فیلڈ کہاں چلی گئی؟

اگر آپ JavaScript سے Go کی طرف منتقل ہوتے ہیں، تو ایک چیز آپ کو حیران کر دے گی۔

ایک package.json فائل کھولیں۔ آپ کو بالکل اوپر ایک version فیلڈ نظر آئے گی۔ اسے پڑھنا آسان ہے۔ آپ اسے ایک pull request میں تبدیل کر سکتے ہیں۔ یہ آپ کے کوڈ کے اندر ہی موجود ہوتی ہے۔

اب ایک go.mod فائل کھولیں۔

ورژن وہاں موجود نہیں ہے۔ یہ کوئی غلطی نہیں ہے۔ یہ ایک انتخاب ہے۔

Go آپ کے اپنے ماڈیول کے لیے version فیلڈ کا استعمال نہیں کرتا۔ اس کے بجائے یہ git tags کا استعمال کرتا ہے۔

یہ کیسے کام کرتا ہے: • آپ git tag v1.2.3 چلاتے ہیں • آپ اس ٹیگ کو اپنی ریپوزٹری (repository) میں پش کرتے ہیں • وہ ٹیگ آپ کا ورژن بن جاتا ہے

جب کوئی go get چلاتا ہے، تو Go صحیح commit تلاش کرنے کے لیے آپ کے git tags کو دیکھتا ہے۔ وہ ٹیگ ہی حقیقت کا واحد ذریعہ (single source of truth) ہوتا ہے۔

اس ڈیزائن کی ایک بڑی خوبی ہے۔ ورژن کبھی بھی غلط کوڈ کی طرف اشارہ نہیں کر سکتا۔ npm میں، پبلش شدہ کوڈ اور ورژن فیلڈ ایک دوسرے سے الگ ہو سکتے ہیں۔ Go میں، یہ دونوں ایک ہی چیز ہیں۔ ورژن ہی commit ہے۔

تاہم، یہ آپ کے ورک فلو (workflow) کو تبدیل کر دیتا ہے:

مثال: v1 github.com/you/my-app استعمال کرتا ہے v2 github.com/you/my-app/v2 استعمال کرتا ہے

یہ ایک ہی پروگرام کو بغیر کسی تصادم (conflict) کے ایک ہی لائبریری کے دو مختلف میجر ورژنز استعمال کرنے کی اجازت دیتا ہے۔

زیادہ تر دوسری زبانیں ورژن کو ایک فائل میں رکھتی ہیں: • Node: package.json • Rust: Cargo.toml • Python: pyproject.toml • Java: pom.xml

Go ایک استثنا (outlier) ہے۔ یہ مکمل طور پر git tags پر انحصار کرتا ہے۔

اگر آپ npm کے تجربے کو یاد کرتے ہیں، تو آپ ldflags کا استعمال کرتے ہوئے بلڈ کے وقت (build time) اپنے بائنری (binary) میں ورژن شامل کر سکتے ہیں۔ اس سے آپ کی ایپ ورژن کمانڈ کا جواب دے سکتی ہے۔

اس کا تبادلہ (trade-off) سادہ ہے: ایک ورژن فیلڈ پڑھنے اور ریویو کرنے میں آسان ہے، لیکن یہ جھوٹ بول سکتی ہے۔ ایک git tag دیکھنا مشکل ہے، لیکن یہ ہمیشہ سچ ہوتا ہے۔

Go نے سہولت کے مقابلے میں سچائی کا انتخاب کیا۔

Go ڈویلپرز کے لیے: کیا یہ بہترین ماڈل ہے؟ اگر ٹولز اسے git tag کے خلاف تصدیق (verify) کریں، تو کیا آپ go.mod میں ورژن فیلڈ کو ترجیح دیں گے؟

ماخذ (Source): https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301