۳ دقیقه مطالعه
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 را بخوانید.
نوشتههای مرتبط
شاید این نوشتهها هم برای شما مفید باشند.
مشکل Memory Leak هنگام استفاده از hash در Webpack
در این مقاله یک مشکل رایج Memory Leak در Webpack هنگام استفاده از contenthash در محیط توسعه بررسی میشود و راهحلی عملی ارائه میشود.
خواندن نوشتهنسخهبندی معنایی (Semantic Versioning)
مروری سریع بر نسخهبندی معنایی و دلیل استفاده از آن در پروژههای نرمافزاری.
خواندن نوشته