package.json বনাম go.mod: ভার্সন ফিল্ডটি কোথায় হারিয়ে গেল?

আপনি যদি JavaScript থেকে Go-তে চলে আসেন, তবে একটি বিষয় আপনাকে অবাক করবে।

একটি package.json ফাইল খুলুন। আপনি একদম উপরে একটি version ফিল্ড দেখতে পাবেন। এটি পড়া সহজ। আপনি একটি pull request-এর মাধ্যমে এটি পরিবর্তন করতে পারেন। এটি আপনার কোডের ভেতরেই থাকে।

এবার একটি go.mod ফাইল খুলুন।

সেখানে ভার্সনটি নেই। এটি কোনো ভুল নয়। এটি একটি সিদ্ধান্ত।

Go আপনার নিজস্ব মডিউলের জন্য কোনো version ফিল্ড ব্যবহার করে না। পরিবর্তে এটি git tags ব্যবহার করে।

যেভাবে এটি কাজ করে: • আপনি git tag v1.2.3 রান করেন • আপনি ট্যাগটি আপনার রিপোজিটরিতে পুশ করেন • সেই ট্যাগটিই আপনার ভার্সন হয়ে দাঁড়ায়

যখন কেউ go get রান করে, Go সঠিক commit খুঁজে পেতে আপনার git tags পরীক্ষা করে। এই ট্যাগটিই হলো তথ্যের একমাত্র উৎস (single source of truth)।

এই ডিজাইনের একটি বড় শক্তি রয়েছে। একটি ভার্সন কখনোই ভুল কোডের দিকে নির্দেশ করতে পারে না। npm-এর ক্ষেত্রে, প্রকাশিত কোড এবং version ফিল্ডের মধ্যে অমিল থাকতে পারে। কিন্তু 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-এর অভিজ্ঞতা মিস করেন, তবে আপনি build time-এ ldflags ব্যবহার করে আপনার binary-তে ভার্সনটি ইনজেক্ট করতে পারেন। এটি আপনার অ্যাপকে একটি version কমান্ডের বিপরীতে সাড়া দিতে সাহায্য করে।

এর বিনিময় বা ভারসাম্য (trade-off) খুব সহজ: একটি version ফিল্ড পড়া এবং রিভিউ করা সহজ, কিন্তু এটি ভুল তথ্য দিতে পারে। একটি git tag দেখা কঠিন, কিন্তু এটি সবসময় সত্য।

Go সুবিধার চেয়ে সত্যকে প্রাধান্য দিয়েছে।

Go ডেভেলপারদের উদ্দেশ্যে: এটি কি সেরা মডেল? যদি টুলগুলো git tag-এর সাথে যাচাই করে দিত, তবে আপনি কি go.mod-এ একটি version ফিল্ড পছন্দ করতেন?

উৎস: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301