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

نسخه‌ بندی معنایی چیست ؟ حتما شما هم هنگام دانلود نرم افزار ها یا پکیج های مختلفی که بر روی  زبان های برنامه نویسی  و فریم ورک ها نصب می کنید، متوجه اعداد مروزی در انتهای نام آن ها شده اید. شاید هم می خواهید پکیج جدید و یا اپلیکیشنی منتشر کنید و نیاز دارید بدانید چه طور باید نام گذاری صحیح و اصولی داشته باشید. برای پاسخ سوال فوق با ما همراه باشید.

نسخه‌بندی معنایی

نسخه‌بندی معنایی

کابوس به روزرسانی !

در توسعه نرم افزار با استفاده از فریم ورک ها با مفهوم پایه ای به نام وابستگی (dependency ) رو به رو هستیم. استفاده از پکیج های مختلف در توسعه یک نرم افزار به کمک ما می آید تا بتوانیم از دنیایی از کدهای آماده که به صورت رایگان در اختیار ما قرار گرفته است استفاده کنیم و یا بالعکس، بتوانیم تجربیات خود را تحت عنوان یک پکیج برای دیگران به اشتراک بگذاریم. حال فرض کنید که شما اپلییکیشینی دارید با چندین dependency . بعد از چند وقتی به سراغ آن می روید و پکیج های خود را به روز رسانی می کنید. اینجاست که احتمالا با خطاهای زیادی رو به رو می شوید که کابوس وار تمام کدهای شما را فرا می گیرید! اینجاست که نسخه بندی معنایی برای جلوگیری از کابوس به روز رسانی به کمک ما می آید.

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

نسخه‌ بندی معنایی در واقع قراردادی برای معرفی نسخه های مختلف یک اپلیکیشن یا پکیج می باشد که از سه بخش اجباری و بخش های اختیاری تشکیل می شود. یه بخش ضروری شامل سه عدد می باشد که با استفاده از کاراکتر نقطه(.) از هم تمیز داده می شود. شکل زیر شماتیک کلی بخش های اصلی در نسخه‌ بندی معنایی را نشان می دهد.

نسخه بندی معنایی

نسخه بندی معنایی

 

عدد اول شماره نسخه اصلی(MAJOR)

نسخه‌ بندی معنایی با MAJOR  شروع می شود.این عدد شماره نسخه اصلی برنامه شما را مشخص می کند. نرم افزارهایی که از نسخه‌ بندی معنایی استفاده می کنند باید یک API  عمومی برای خود اعلام کنند. اگر شما به وب سایت رسمی هر یک از زبان ها برنامه نویسی مراجعه کنید در قسمت داکیومنت آن ها می توانید به API مربوط به آن ها دسترسی داشته باشید. به بیان ساده تر عدد اول را می توان به ساختار کد ها و معماری نسبت داد. در واقع هرگاه تغییر ساختاری در پکیج و یا اپلیکیشن ها رخ دهد این عدد تغییر می کند. منظور از تغییر ساختاری تغییری است که به احتمال زیاد منجر به ناسازگاری در نسخه قبلی می شود. یعنی اگر در مورد یک اپلیکیشن صحبت می کنیم ممکن است با انتشار نسخه جدید ، نسخه های پیشین منسوخ شوند و اگر در رابطه با یک NPM Package   صحبت می کنیم ممکن از استفاده از نسخه جدید مشکلی در اجرای برنامه به وجود آورد و برای حل این مشکل مجبور شویم Syntax قستمی از برنامه را به طرو کلی تغییر دهیم. این نسخه بندی برای زبان های برنامه نویسی هم رخ می هد. هرگاه زبان برنامه نویسی تغییرات ساختاری داشته باشد نسخه MAJOR اضافه می شود. در این رابطه می توان PYTHON  را مثال زد که در PYTHON 3 در مقایسه با PYTHON 2 تغییرات Syntax  داشته است. همچنین در این زمان که این مقاله درحال نگارش است نسخه v16.9.0   از REACT JS منتشر شده که نشانگر تغییرات وسیع این زبان برنامه نویسی از ابتدای انتشارش می باشد. در مقابل می توان زبان برنامه نویسی JAVA را مثال زد که آخرین نسخه آن ۱.۸.۰ است! این مقایسه می تواند از یک سو نشانگر آینده نگری توسعه دهنگان جاوا باشد که با این حجم از تغییرات در دنیای وب همچنان نیاز به تغییر ساختاری پیدا نکرده اند و یک سو هم می تواند نشانگر به روز بودن تیم توسعه  REACT JS باشد که مدام در حال انتشار نسخه های گوناگون با کارکرد های بهتر هستند. پس لزوما نسخه اصلی بالا نشانگر خوب بودن یا نبودن نیست.

اما بدیهی است که اگر بخواهیم کاربران را در نظربگیریم هر چه نسخه پایدارتری را به آن ها ارائه دهیم. راحت تر هستند و درگیر مشکلات به روزرسانی و ناسازگاری های احتمالی نخواهند شد.

پس بهتر است از ابتدا ساختار و معماری را بر پایه تحلیلی درست پیش ببریم تا مجبور به عوض کردن ساختار در طول زمان نشویم.

جالب است بدانید که REACT NATIVE که به تازگی بسیار در نزد توسعه دهندگان محبوب شده و هم اکنون افراد زیاد در حال توسعه محصولات خود با آن هستند هنوز در نسخه ۰.۶۰ خود قرار دارد! این به این معناست که توسعه دهندگان آن هنوز نسخه ای بدون عیب و نقص برای آن معرفی نکرده اند. با دیدن عدد ۰ در نسخه اصلی متوجه این نکته می شویم که این زبان برنامه نویسی یا پکیج یا هر چیز دیگری هنوز از طرف توسعه دهنده احتمال باگ دارد و به عنوان یک نسخه رسمی ارائه نشده است و به احتمال زیاد API ارائه شده دست خوش تغییرات خواهد شد. هر چند ممکن از همین نسخه هم بسیار پرکاربرد باشد! در واقع توسعه دهندگان با انشار نسخه ۰ سعی می کنند پذیرندگان آغازین خود را دریافت و کلیه feedback  ها را برای ساخت یک نسخه پایدار(stable) را بگیرند و در نهایت یک نسخه با معماری بدون نقص ارائه دهند.

عدد دوم نسخه جزئی (MINOR)

هر زمان که تغییرات پکیج یا اپلیکیشن ما به صورتی باشد که تداخلی با نسخه های دیگر نداشته باشد این عدد اضافه می شود. این تغییرات می تواند شامل بهبود عملکرد در نسخه فعلی و یا اضافه شدن یک امکان تازه برای کاربران ما باشد. در هنگام به روزرسانی پکیج ها، برخلاف نسخه معنایی اصلی، بهتر است همواره پکیج های خود را در آخرین نسخه به روز نگه داریم.

عدد سوم شماره نسخه وصله (PATCH)

patch

patch

هرگاه تغییرات ما بسیار جزئی  بودند ( مانند در حد رفع باگ در نسخه MINOR)  و یا هرگونه تغییر کوچک دیگر، این شماره افزایش می یابد. در واقع این عدد در حکم تعداد وصله هاییست که ما به پکیج خود می زنیم تا عیب و نقص هایی کوچک آن را بپوشاتیم.

یک نکته:

در نسخه‌ بندی معنایی ، هر زمان که هر کدام از این اعداد تغییر کرند، تمامی اعداد سمت راست عدد تغییر یافته باید ۰ شوند.

سایر اعداد وکاراکتر ها در نسخه بندی معنایی

در نسخه‌ بندی معنایی بعد از اعداد گفته شده در بالا ممکن است اعداد و یا حروف دیگری هم مشاهده کنید. این توضیحات اضافی با یک – از نسخه برنامه جدا می شوند و نشان دهنده این هستند که این نسحه برای پیش نمایش ارائه شده است و نسخه پایداری از برنامه نیست. برای مثال  ۱.۰.۰-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92 1.0.0-beta  ۱.۰.۰-alpha.beta. 

هر کدام از کلمات alpha  و beta  نمایانگر یکی از مراحل تست های استاندارد در مهندسی نرم افزار می باشد که توضیح آن در این مقاله نمی گنجد.

برای شروع از چه نسخه ای باید استفاده کنم؟

بهترین کار برای شروع این است که انتشار را با نسخه ۰.۱.۰ شروع و کم کم با توجه به feedback  های دریافتی و برنامه توسعه اقدام به افزایش نسخه کنید.

چگونه پکیج هایمان را همیشه به روز نگه داریم؟

در این جا می خواهیم توضیحاتی را در رابطه به به روزرسانی پکیج ها در NPM بیان کنیم. برای ماژول های سایر زبان های برنامه نویسی هم مطالب زیر با تغییرات کمی صادق خواهند بود.

می دانیم که اطلاعات پکیج های استفاده در برنامه در فایلی به نام packege.json نگه داری می شوند. که این اطلاعات شامل نام پکیج و همینطور شماره نسخه آن می باشد.

قبل از شماره نسخه می توانیم از چهار حالت  برای معرفی نسخه استفاده کنیم.

استفاده از latest

در صورتی که به جای ورژن از کلمه lastest استفاده کنیم به این معنیست که تمایل خود را برای دریافت آخرین نسخه از پکیج اعلام می کنیم. هیچ وقت این حالت را توصیه نمی کنیم چون ممکن است با انتشار نسخه جدید که در آن نسخه MAJOR اضافه شده و تغییرات اساسی رخ داده است منجر به ناسازگاری در کد ها شود.

علامت “^” در قبل از نسخه

این علامت بیانگر این است که آمادگی خود را برای دریافت تمام PATCH ها را اعلام می کنیم. یعنی به عنوان مثال اگر نسخه فعلی ۲.۳.۲ است در صورت انتشار پکیج های ۲.۳.۳ یا ۲.۳.۴ و… ، نسخه ما به روز خواهد شد. اما اگر نسخه ای با MINOR  جدید منتشر شود آپدیتی انجام نمی شود.

علامت “~” در قبل از نسخه

این علامت بیانگر این است که آمادگی خود را برای دریافت تمام PATCH ها و MINOR ها اعلام می کنیم. یعنی به عنوان مثال اگر نسخه فعلی ۲.۳.۲ است در صورت انتشار پکیج های ۲.۳.۳ یا ۲.۴.۱ و… ، نسخه ما به روز خواهد شد.

بدون علامت

اگر علامتی وجود نداشته باشد به این معناست که برنامه فقط مجاز به استفاده از نسخه گفته شده می باشد.

 

برای مطالعه بیشتر منابع زیر را برای مطالعه نسخه‌ بندی معنایی پیشنهاد می کنیم:

https://semver.org/lang/fa/

https://virgool.io/JavaScript8/%D9%86%D8%B3%D8%AE%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%A8%D8%A7-%D9%85%D8%B9%D9%86%D8%A7-semantic-versioning-%D8%AF%D8%B1-npm-zfxiwopnshsq

 

 

 

 

 

دیدگاه شما

نشانی ایمیل شما منتشر نخواهد شد.