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

زمانی که از NPM (مخفف Node Package Manager) استفاده می‌کنید بهتر است نحوی نسخه بندی پکیج هایش و همچنین مفهوم علامت‌های ^ (carets) و ~ (tildes) که قبل از ورژن هر پکیج در فایل package.json نوشته می‌شوند را بدانید.

قبل از اینکه مفهوم این علامت ها را بدانیم باید با نحوی نسخه بندی با معنا (Semantic Versioning) در NPM آشنا باشیم.

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

هر نسخه از پکیج های NPM حداقل دارای سه قسمت به نام های Major، Minor و Patch به شرح زیر است:

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

1. Major (تغییرات بزرگ) :

زمانی عدد این قسمت (عدد اول) از نسخه افزایش می‌یابد که در پکیج تغییرات بزرگی رخ داده باشند. منظور از تغییرات بزرگ این است که کد هایی که با نسخه قبلی نوشته شده‌اند دیگر در این نسخه جدید Major سازگار نیستند.

مثلا اگر از نسخه 5.3.4 به 6.0.0 آپدیت کنید، کد هایی که بر اساس ورژن 5.3.4 نوشته شده‌اند دیگر در نسخه 6.0.0 سازگار نیستند و اگر آپدیت کنید ممکن است در پروژه‌ی شما اختلالی به وجود آید!

دو نکته را باید در نظر بگیرید: الف) این تعریف برای پکیج هایی درست است که اصولی نسخه بندی شده‌اند. ب) ممکن است شما مثلا از 10% پکیج داخل پروژه تون استفاده کرده باشید و با آپدیت major اختلالی در پروژه تون به وجود نیاید و کاملا با پروژه شما سازگار باشد. بنابراین نمی‌شود قطعی گفت ناسازگار می‌شود.

2. Minor (تغییرات جزئی) :

زمانی عدد این قسمت (عدد دوم) از نسخه افزایش می‌یابد که در پکیج تغییرات جزئی رخ داده باشند. منظور از تغییرات جزئی این است که کد پروژه‌هایی که با نسخه قبلی نوشته شده‌اند در نسخه جدید Minor نیز سازگار‌اند. با این تفاوت که بهبودهایی مثل اضافه شدن ویژگی‌ها و متد‌های جدید، بهبود عملکرد توابع و... در این نسخه جدید ایجاد شده‌ است.

3. Patch (وصله ها) :

زمانی عدد این قسمت (عدد سوم) از نسخه افزایش می‌یابد که به پکیج وصله‌هایی (Patch) اضافه شده باشند. منظور از وصله یا پچ تغییرات خیلی جزئی مثل برطرف شدن باگ‌های ورژن Minor در کد پکیج است. کد پروژه‌هایی که با نسخه قبلی نوشته شده‌اند در نسخه جدید Patch (همانند Minor) نیز سازگار‌اند.




علامت های مشخص کننده‌ی بازه (range) نسخه

این قسمت از نسخه (قبل از اعداد) سه حالت می‌تواند داشته باشد:

  1. علامت "^" : به این معنی است که شامل تمام Patch های بعدی است. مثلا اگر قبل از ورژن 1.2.3 از این علامت استفاده کنید شامل تمام ورژن های 1.2.4، 1.2.42، 1.2.6 و... می‌شود. (یعنی فقط عدد سوم می‌تواند بزرگتر مساوی 3 باشد)
  2. علامت "~" : به این معنی است که شامل تمام Patch ها و Minor های بعدی است. مثلا اگر قبل از ورژن 2.4.1 از این علامت استفاده کنید شامل تمام ورژن های 2.4.3، 2.5.0، 2.8.9 و... می‌شود. (یعنی عدد دوم می‌تواند بزرگتر مساوی 4 باشد - عدد اول زمانی که عدد دوم برابر 4 است میتواند بزرگتر مساوی 1 باشد و زمانی که عدد دوم بزرگتر از 4 باشد هر عددی را می‌تواند اختیار کند)
  3. بدون علامت : به این معنی است که دقیقا باید از ورژن ذکر شده استفاده شود. مثلا اگر قبل از 5.3.54 هیچ علامتی نباشد باید دقیقا از همین ورژن استفاده شود و مجاز به استفاده از ورژن های بعدی نیست.

به طور خلاصه:

"^1.2.3" : 1.2.x , x>=3
"~2.4.1" : 2.x.y , x>=4 , if (x == 4) --> y>=1
"5.3.54" : 5.3.54