package.json در مقابل go.mod: فیلد نسخه کجا رفت؟
اگر از JavaScript به Go مهاجرت کنید، یک چیز شما را غافلگیر خواهد کرد.
در یک فایل package.json نسخه دقیقاً در بالا قرار دارد. میتوانید آن را بخوانید. میتوانید آن را در یک pull request تغییر دهید. میتوانید آن را جستجو کنید. این حقیقتی است که درون کد شما زندگی میکند.
حالا یک فایل go.mod را باز کنید. نسخه آنجا نیست.
این یک اشتباه نیست؛ یک انتخاب است.
Go برای ماژول خودتان از فیلد نسخه استفاده نمیکند. در عوض، Go از git tags استفاده میکند.
برای تعیین نسخه در Go، این کار را انجام میدهید:
git tag v1.2.3git push origin v1.2.3
git tag تنها منبع حقیقت (single source of truth) است. وقتی کسی دستور go get را اجرا میکند، Go برای یافتن کامیت (commit) صحیح، تگهای مخزن شما را بررسی میکند.
این طراحی یک نقطه قوت بزرگ دارد. یک نسخه هرگز نمیتواند به کد اشتباهی اشاره کند. در npm، کد منتشر شده و سورس تگ شده ممکن است از هم فاصله بگیرند (drift apart). در Go، این دو یکی هستند، زیرا نسخه در واقع اشارهگری به یک commit است.
با این حال، این موضوع گردش کار (workflow) شما را به چندین روش تغییر میدهد:
- یافتن نسخه نیاز به یک دستور دارد. شما باید به جای نگاه کردن به یک فایل، دستور
git describe --tagsرا اجرا کنید. - افزایش نسخه (version bumps) در بررسیهای کد (code reviews) ظاهر نمیشود. ارسال یک تگ (tag push) یک تغییر کد محسوب نمیشود، بنابراین در یک pull request نمایش داده نمیشود.
- بیلدهای محلی از pseudo-versions استفاده میکنند. تا زمانی که یک commit را تگ نکنید، به جای یک نسخه تمیز مانند
v1.2.3با رشتهای طولانی از اعداد و هشها روبرو هستید. - نسخههای اصلی (Major versions) مسیر import شما را تغییر میدهند. در npm، شما شماره نسخه را تغییر میدهید اما نام پکیج را ثابت نگه میدارید. در Go، نسخههای
v2و بالاتر نیازمند تغییر مسیر مانند/v2هستند. این کار به برنامه اجازه میدهد تا از نسخهv1وv2یک کتابخانه به طور همزمان و بدون
برای کسانی که کدهای Go را عرضه میکنند: مدل مبتنی بر تگ (tag-only model) در کار روزانهی شما چگونه است؟ آیا آن را تغییر میدادید؟
منبع: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301