𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 𝘃𝘀 𝗴𝗼.𝗺𝗼𝗱: 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 𝗳𝗶𝗲𝗹𝗱 कुठे गायब झाले?

जर तुम्ही JavaScript कडून Go कडे गेलात, तर एक गोष्ट तुम्हाला आश्चर्यचकित करेल.

एक package.json फाईल उघडा. तुम्हाला अगदी वरच्या बाजूला एक version फील्ड दिसेल. ते वाचायला सोपे आहे. तुम्ही pull request मध्ये ते बदलू शकता. ते तुमच्या कोडच्या आतच असते.

आता एक go.mod फाईल उघडा.

तिथे व्हर्जन (version) नाहीये. ही कोणतीही चूक नाही. हा एक जाणीवपूर्वक घेतलेला निर्णय आहे.

Go तुमच्या स्वतःच्या मॉड्यूलसाठी version फील्ड वापरत नाही. त्याऐवजी ते git tags वापरते.

हे कसे कार्य करते: • तुम्ही git tag v1.2.3 रन करता • तुम्ही तो tag तुमच्या रिपॉझिटरीमध्ये (repository) पुश करता • तो tag तुमचे व्हर्जन बनते

जेव्हा कोणी go get रन करते, तेव्हा Go योग्य commit शोधण्यासाठी तुमच्या git tags कडे पाहते. तो tag हाच 'single source of truth' असतो.

या डिझाइनची एक मोठी ताकद आहे. व्हर्जन कधीही चुकीच्या कोडकडे निर्देश करू शकत नाही. npm मध्ये, पब्लिश केलेला कोड आणि version field एकमेकांपासून वेगळे होऊ शकतात. 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 हा यापेक्षा वेगळा आहे. ते पूर्णपणे git tags वर अवलंबून आहे.

जर तुम्हाला npm चा अनुभव हवा असेल, तर तुम्ही ldflags वापरून बिल्ड टाइमला तुमच्या binary मध्ये व्हर्जन इंजेक्ट (inject) करू शकता. यामुळे तुमचे ॲप व्हर्जन कमांडला प्रतिसाद देऊ शकते.

याचा ट्रेड-ऑफ (trade-off) साधा आहे: व्हर्जन फील्ड वाचायला आणि रिव्ह्यू करायला सोपे असते, पण ते खोटे असू शकते. git tag शोधायला कठीण असते, पण ते नेहमी सत्य असते.

Go ने सोयीपेक्षा सत्याला महत्त्व दिले.

Go डेव्हलपर्ससाठी: हे सर्वोत्तम मॉडेल आहे का? जर टूल्सने git tag च्या आधारे पडताळणी केली, तर तुम्हाला go.mod मध्ये व्हर्जन फील्ड हवे आहे का?

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