پرش به محتوای اصلی
بازگشت به صفحه اصلی

۳ دقیقه مطالعه

SemVer در npm به زبان ساده

در این مقاله می‌بینیم علامت‌های ^ و ~ در نسخه‌گذاری npm چه معنایی دارند و npm install چگونه با آن‌ها رفتار می‌کند.

نسخه‌بندی معنایی (Semantic Versioning) چیست؟

هنگام انتشار نسخه جدید یا ارائه یک hotfix، از ساختاری مشخص برای شماره‌گذاری نسخه‌ها استفاده می‌کنیم؛ مانند 1.0.0 یا 1.0.1. این ساختار استاندارد، Semantic Versioning یا SemVer نام دارد.

شماره نسخه به توسعه‌دهندگان نشان می‌دهد چه تغییری در محصول رخ داده و به‌روزرسانی آن تا چه اندازه ممکن است با نسخه قبلی ناسازگار باشد.

اجزای نسخه

فرمت کلی نسخه به شکل MAJOR.MINOR.PATCH است:

  • نسخه Patch: عدد سمت راست است و برای اصلاح باگ‌هایی استفاده می‌شود که قابلیت‌ها یا ساختار اصلی برنامه را تغییر نمی‌دهند. برای مثال، 1.0.0 به 1.0.1 تبدیل می‌شود.
  • نسخه Minor: عدد میانی است و برای اضافه‌کردن قابلیت‌های جدیدِ سازگار با نسخه قبلی افزایش پیدا می‌کند. برای مثال، 1.0.1 به 1.1.0 تبدیل می‌شود.
  • نسخه Major: عدد سمت چپ است و هنگام ایجاد تغییرات ناسازگار با نسخه قبلی افزایش پیدا می‌کند. برای مثال، 1.2.3 به 2.0.0 تبدیل می‌شود.

نسخه Pre-release

برای انتشار نسخه آزمایشی می‌توانیم از شناسه‌هایی مانند alpha، beta و rc استفاده کنیم:

1.0.0-alpha
1.0.0-beta
1.2.0-rc.1

SemVer در npm یعنی چه؟

npm نیز از همین ساختار نسخه‌بندی استفاده می‌کند. در فایل package.json می‌توانیم مشخص کنیم چه بازه‌ای از نسخه‌های یک پکیج برای پروژه قابل‌قبول است. برای مثال:

"axios": "^1.2.3"

یا:

"react": "~18.2.0"

حالا ببینیم علامت‌های ^ و ~ دقیقاً چه معنایی دارند.

علامت ^ یا Caret

علامت ^ اجازه می‌دهد نسخه‌های MINOR و PATCH به‌روزرسانی شوند، اما نسخه MAJOR تغییر نکند.

برای مثال:

"axios": "^1.2.3"

نسخه‌های زیر با این محدودیت سازگار هستند:

  • 1.2.4
  • 1.3.0
  • 1.9.9
  • 2.0.0

نکته: برای نسخه‌های پایین‌تر از 1.0.0، مانند ^0.2.3، محدودیت سخت‌گیرانه‌تر است؛ زیرا حتی تغییرات MINOR هم ممکن است ناسازگار باشند.

علامت ~ یا Tilde

علامت ~ فقط اجازه به‌روزرسانی بخش PATCH را می‌دهد و بخش‌های MINOR و MAJOR ثابت می‌مانند.

برای مثال:

"react": "~18.2.0"

نسخه‌های زیر با این محدودیت سازگار هستند:

  • 18.2.1
  • 18.2.5
  • 18.3.0
  • 19.0.0

نسخه دقیق یا Exact Version

اگر نسخه را بدون علامت بنویسیم، فقط همان نسخه نصب خواهد شد:

"lodash": "4.17.21"

در این حالت حتی نسخه PATCH جدیدتر نیز به‌صورت خودکار انتخاب نمی‌شود.

هنگام اجرای npm install چه اتفاقی می‌افتد؟

وقتی npm install را اجرا می‌کنیم، npm محدودیت نوشته‌شده در package.json را بررسی می‌کند و جدیدترین نسخه سازگار با آن را انتخاب می‌کند.

برای مثال، اگر بنویسیم:

"vue": "^3.2.0"

و نسخه 3.3.1 منتشر شده باشد، اما نسخه 4.0.0 هنوز منتشر نشده باشد، npm نسخه 3.3.1 را نصب می‌کند؛ چون با ^3.2.0 سازگار است.

تفاوت npm install و npm install package@version

اجرای ساده npm install نسخه‌ها را بر اساس محدودیت‌های package.json انتخاب می‌کند. اما در دستور زیر، نسخه دقیق پکیج را مشخص می‌کنیم:

npm install react@18.2.0

این دستور نسخه 18.2.0 را نصب می‌کند و محدودیت نسخه را نیز در package.json ثبت می‌کند.

فایل package-lock.json چه کاری انجام می‌دهد؟

این فایل نسخه دقیق تمام پکیج‌های نصب‌شده را ثبت می‌کند. بنابراین حتی اگر محدودیت نسخه در package.json باز باشد، نصب‌های بعدی روی دستگاه‌های دیگر یا در CI/CD با همان نسخه‌های ثبت‌شده انجام می‌شوند و نتیجه قابل‌پیش‌بینی باقی می‌ماند.

پس اگر یک روز با وجود تعریف ^1.0.0 نسخه 1.9.9 نصب شد، جای تعجب نیست؛ این رفتار مطابق قواعد SemVer است.

اگر با مشکل Memory Leak در Webpack هنگام استفاده از hash آشنا نیستید، مقاله مشکل Memory Leak هنگام استفاده از hash در Webpack را بخوانید.

منبع مطالعه بیشتر

اشتراک‌گذاری:Xin
نماد بصری علی عمرایی

علی عمرایی

مهندس ارشد فرانت‌اند با بیش از ۵ سال تجربه در React، Next.js، TypeScript و معماری فرانت‌اند سازمانی. درباره بهینه‌سازی، PWA، معماری و تجربه‌های پروژه‌های واقعی می‌نویسم.

نوشته‌های مرتبط

شاید این نوشته‌ها هم برای شما مفید باشند.

۵ دقیقه مطالعه

مشکل Memory Leak هنگام استفاده از hash در Webpack

در این مقاله یک مشکل رایج Memory Leak در Webpack هنگام استفاده از contenthash در محیط توسعه بررسی می‌شود و راه‌حلی عملی ارائه می‌شود.

خواندن نوشته
۲ دقیقه مطالعه

نسخه‌بندی معنایی (Semantic Versioning)

مروری سریع بر نسخه‌بندی معنایی و دلیل استفاده از آن در پروژه‌های نرم‌افزاری.

خواندن نوشته