𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 𝘃𝘀 𝗴𝗼.𝗺𝗼𝗱: 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 𝗳𝗶𝗲𝗹𝗱 कुठे गायब झाले?
जर तुम्ही 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) बदलतो:
- दृश्यमानता (Visibility): तुम्ही फाईल पाहून तुमचे व्हर्जन पाहू शकत नाही. ते शोधण्यासाठी तुम्हाला git कमांड रन करावी लागेल.
- कोड रिव्ह्यू (Code Reviews): व्हर्जन वाढवणे (version bump) कोड डिफ (code diff) मध्ये दिसत नाही. ते एक tag push असते, कोडमधील बदल नाही.
- लोकल बिल्ड्स (Local Builds): टॅग नसलेला commit एक गोंधळलेले pseudo-version दाखवतो. तुम्ही commit ला tag केल्यानंतरच तुम्हाला स्वच्छ (clean) व्हर्जन मिळते.
- मेजर व्हर्जन (Major Versions): हा सर्वात मोठा बदल आहे. Go मध्ये, v2 आणि त्यावरील व्हर्जनसाठी import path मध्ये व्हर्जन समाविष्ट असणे आवश्यक आहे.
उदाहरण: 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