يعتبر ملف package-lock.json
من الملفات المهمة التي لا يخلو منها أي مشروع Node.js مهما كان بسيطا. فما من شك أنك صادفته أو لاحظته موجودا ضمن ملفات مشروعك وربما تساءلتَ للوهلة الأولى عن مدى أهميته، وفيما إذا كان عليك إضافته إلى Git أو لاَ.
سألت نفسي هذه الأسئلة أكثر من مرة في بدايات تعاملي مع Node.js منذ سنوات وبحثت في أكثر من مكان لأفهم الصورة كاملة، وها أنا اليوم أشارك معك ما تعلمته أو ما يجب عليك معرفته حول هذا الملف حتى لا يشكل لك بعد اليوم صداعا في رأسك كلما لمحته جاثما هناك بين ملفات مشروعك.
القصة تبدأ من الإصدارات الدلالية أو Semantic versioning
كلنا تعاملنا مع حزم واعتماديات برمجية ونحن نشتغل في مشاريعنا، بغض النظر عن التقنيات المستخدمة. قد تكون PHP ،Node.js أو أي لغة برمجة أخرى.
ومنا المعلوم أن كل حزمة برمجية يتم تطويرها وصيانتها باستمرار، إما لإضافة مزايا (Features) جديدة إليها أو لتصحيح الأخطاء (Bugs) التي ظهرت بعد نشرها.
في كل مرة يتم نشر نسخة جديدة من تلك الحزمة مع الإضافات الجديدة، وكل نسخة تحمل رقم إصدار يعرف بِ Version.
تم الإتفاق بين أوساط المبرمجين على اتباع نمط معين لترقيم تلك الإصدارات أو النسخ بشكل دلالي يجعل الأطراف الأخرى (مبرمجين وكذا مدراء الحزم مثل npm أو composer بالنسبة ل PHP وغيرهما) قادرة على التنبؤ بنوعية التعديلات التي أدخلت على تلك الحزمة من إصدار لآخر.
اصطُلِح على تسمية هذا النمط في ترقيم الإصدارات بِ Semantic Versioning أو الإصدارات الدلالية، وقرأت في بعض المقالات أنهم استخدموا “الترقيم الدلالي” كترجمة إلى العربية. ويمكن قبول كلتا الترجمتين على حسب رأيي.
كل إصدار أو نسخة دلالية تكون على الشكل التالي:
كل إصدار أو نسخة دلالية تكون على شكل x.y.z
، بحيث أن:
- الرقم
x
يعرف بِ Major ويشير إلى كل إصدار كبير أو جذري غير متوافق رجعيا مع الواجهة البرمجية للإصدار السابق (Breaking changes). - الرقم
y
يعرف بِ Minor ويعني أننا أضفنا مميزات جديدة ولكنها متوافقة مع الإصدارات السابقة (Backward compatible). - الرقم
z
يعرف بِ Patch ويدل على أن ثمة ثغرة أو خطأ برمجي تم إصلاحه في الإصدار الجديد ولكنه لا يكسر التوافقية مثل سابقه.
كل مشرف (Maintainer) على حزمة برمجية موصى بالتزام اصطلاحات Semantic Versioning بشكل دقيق عند ترقيم إصداراته حتى لا يربك المطورين من مستعلمي تلك الحزمة وكذلك مدراء الإعتماديات (Dependencies managers).
إلى هنا أعتقد أنه هذا كل ما يجب عليك معرفته بخصوص الإصدارات الدلالية لكي نعود إلى موضوعنا الأساسي package-lock.json
وعلاقته بكل ما قلناه.
- يمكنك زيارة semver.org للمزيد من المعلومات حول هذا الموضوع.
مالذي يحدث عندما نقوم بتثبيت حزمة بواسطة npm ؟
عندما نضيف حزمة جديدة إلى مشروعنا عن طريق npm install
فإنها تُضاف بشكل أوتوماتيكي إلى قائمة اعتماديات المشروع (Dependencies) في الملف package.json
كالتالي: