𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 बनाम 𝗚𝗼.𝗺𝗼𝗱: 𝗩𝗲𝗿𝘀𝗶𝗼𝗻 𝗙𝗶𝗲𝗹𝗱 कहाँ गया?

यदि आप JavaScript से Go पर जाते हैं, तो एक चीज़ आपको हैरान कर देगी।

package.json फ़ाइल में, version बिल्कुल ऊपर होता है। आप इसे पढ़ सकते हैं। आप इसे pull request में बदल सकते हैं। आप इसे खोज सकते हैं। यह एक ऐसा तथ्य है जो आपके कोड के भीतर रहता है।

अब एक go.mod फ़ाइल खोलें। वहाँ version नहीं है।

यह कोई गलती नहीं है। यह एक चुनाव है।

Go आपके अपने module के लिए version field का उपयोग नहीं करता है। इसके बजाय, Go git tags का उपयोग करता है।

Go में version सेट करने के लिए, आप यह करते हैं:

git tag ही 'single source of truth' है। जब कोई go get चलाता है, तो Go सही commit खोजने के लिए आपके repository tags को देखता है।

इस डिज़ाइन की एक बड़ी ताकत है। version कभी भी गलत कोड की ओर इशारा नहीं कर सकता। npm में, published code और tagged source अलग-अलग हो सकते हैं। Go में, वे एक ही चीज़ हैं क्योंकि version एक commit का pointer है।

हालाँकि, यह आपके workflow को कई तरह से बदल देता है:

अधिकांश अन्य ecosystems version को एक फ़ाइल में रखते हैं:

Go अलग है। यह केवल git tags पर निर्भर करता है।

यदि आप चाहते हैं कि आपका Go binary एक साफ version दिखाए, तो आप build process के दौरान ldflags का उपयोग करके इसे inject कर सकते हैं। कई developers tag और release process को automate करने के लिए goreleaser जैसे tools का भी उपयोग करते हैं।

ये दोनों मॉडल अलग-अलग प्राथमिकताओं (priorities) को दर्शाते हैं:

Go ने tag model को इसलिए चुना ताकि यह सुनिश्चित किया जा सके कि manifest हमेशा कोड से मेल खाए।

जो लोग Go कोड शिप करते हैं: आपके दैनिक कार्य में केवल टैग वाला मॉडल (tag-only model) कैसा महसूस होता है? क्या आप इसे बदलना चाहेंगे?

स्रोत: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301