package.json در مقابل go.mod: فیلد نسخه کجا رفت؟

اگر از JavaScript به Go مهاجرت کنید، یک چیز شما را غافلگیر خواهد کرد.

در یک فایل package.json نسخه دقیقاً در بالا قرار دارد. می‌توانید آن را بخوانید. می‌توانید آن را در یک pull request تغییر دهید. می‌توانید آن را جستجو کنید. این حقیقتی است که درون کد شما زندگی می‌کند.

حالا یک فایل go.mod را باز کنید. نسخه آنجا نیست.

این یک اشتباه نیست؛ یک انتخاب است.

Go برای ماژول خودتان از فیلد نسخه استفاده نمی‌کند. در عوض، Go از git tags استفاده می‌کند.

برای تعیین نسخه در Go، این کار را انجام می‌دهید:

git tag تنها منبع حقیقت (single source of truth) است. وقتی کسی دستور go get را اجرا می‌کند، Go برای یافتن کامیت (commit) صحیح، تگ‌های مخزن شما را بررسی می‌کند.

این طراحی یک نقطه قوت بزرگ دارد. یک نسخه هرگز نمی‌تواند به کد اشتباهی اشاره کند. در npm، کد منتشر شده و سورس تگ شده ممکن است از هم فاصله بگیرند (drift apart). در Go، این دو یکی هستند، زیرا نسخه در واقع اشاره‌گری به یک commit است.

با این حال، این موضوع گردش کار (workflow) شما را به چندین روش تغییر می‌دهد:

برای کسانی که کدهای Go را عرضه می‌کنند: مدل مبتنی بر تگ (tag-only model) در کار روزانه‌ی شما چگونه است؟ آیا آن را تغییر می‌دادید؟

منبع: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301