يسألني الناس أينما ذهبت - في المؤتمرات، المحاضرات، لدى وكالات تطوير المواقع وغيرها - عن ملف composer.lock
. يبدو وكأن الأمر يتعلّق بلغز يزرع الشكوك حول المعمورة! أقدّم لك هذا المقال لتوضيح ماهية هذا الملف وفكّ اللغز الذي يمثّله.
يعدّ Composer أداة تدير الإصدارات الخاصة بمكتبات PHP التي يستخدمها المطوّرون في مشاريعهم البرمجية. سأفترض - لأغراض هذا المقال - أنه سبق لك استخدام Composer في مشاريع سابقة.
فلنفترض أن لدينا مشروع PHP جديدا ندير اعتماديّاته Dependencies عن طريق Composer. نبدأ بملف composer.json
الذي يُستخدَم لإعداد لائحة بالاعتماديّات التي نريد تثبيتها. يبدو الملف على النحو التالي:
{ "require": { "assassins/ezio": "1.1.0", "assassins/edward": "1.1.2", "templars/shay": "1.1.*", } }
عرّفنا بوضوح الإصدارات التي نحتاجها بالنسبة للحزمتين الأولى والثانية؛ إلا أن الأمر مختلف قليلا يالنسبة للحزمة الثالثة templars/shay
التي حدّدنا لها بطريقة أكثر مرونة فلم نعرّف إصدار الترقيع Patch version؛ وبالتالي سيكون أي ترقيع للإصدار 1.1
مناسبا للمشروع.
تنبغي ملاحظة أن هذه الأسماء المذكورة في الشفرة أعلاه هي أسماء مفترضة لحزم وليست حزما حقيقية يمكن تثبيتها.
يمكن القول إن ملف composer.json
هو دليل “تقريبي” للإصدارات التي نريد تثبيتها؛ فاستخدام ماسك المكان *
يجعل إصدارات عدّة متوافرة لاستخدامها. بمعنى آخر، يحدّد الملف هامشا مقبولا لهرميّة الاعتماديّات في التطبيق.
لا يوجد لدينا لحدّ الساعة، أي في بداية المشروع، ملفّ composer.lock
؛ إلا أنه سيظهر بعد تنفيذنا للأمر composer install
. نجد مباشرة بعد تنفيذ الأمر composer install
ملفّا غريبا باسم composer.lock
في المجلّد الجذر للمشروع. إن ألقيت نظرة على ما بداخله فستجد أنه كبير نوعا ما.
حان الوقت الآن لكشف اللّغز. في الواقع؛ الملف composer.json
هو دليل تقريبي - كما قلنا - لإصدارات الاعتماديّات التي يتوجّب على Composer تثبيتها، بينما الملف composer.lock
هو تسجيل دقيق بالإصدارات التي ثُبِّتت عند تنفيذ الأمر composer install
. أي أنه يسجّل ما ثبّته Composer من مكتبات لمشروعك. في ما يلي مثال بسيط:
"source": { "type": "git", "url": "https://github.com/templars/shay.git", "reference": "98c313c831e5d99bb393ba1844df91bab2bb5b8b" },
هل ترى سلسلة المحارف الطويلةَ تلك؟ هذا هو المعرّف الدقيق لإيداع Commit الإصدار المثبّت عندما اتّبع Composer تعليمات composer.json
. يحتفظ الملف composer.lock
كذلك بجميع إصدارات الاعتماديّات التي تتطلّبها اعتماديّات المشروع؛ والمكتبات التي تقوم عليها اعتماديّات اعتمديّات المشروع.. وهكذا دواليك. يعني هذا أن الملف composer.lock
يحوي التسلسل الهرمي الكامل لاعتماديّات التطبيق.
-
في ماذا يفيد وجود التسلسل الهرمي لاعتماديّات المشروع في الملف
composer.lock
؟
حسنا؛ يمكن أن تجرّب حذف المجلّد الذي توجد به اعتماديّات المشروع، مثلا vendor
في Laravel؛ ثم تنفيذ الأمر composer install
من جديد. سيجد Composer هذه المرة أن لديك ملفّ composer.lock
وبدلا من البحث عن إصدارات متوافقة مع تعليمات الملف composer.json
فسيلجأ إلى الإصدارات الدقيقة المذكورة في الملف composer.lock
ويثبّتها. يعني هذا أننا سنحصُل على نفس المكتبات التي حذفناها بحذف مجلّد الاعتماديّات.
-
سؤال آخر.. هل يجب تضمين الملف
composer.lock
في مستودع Git؟
يجب أن تكون الإجابة الآن واضحة. إن أردت تسجيل الإصدارات الدقيقة للاعتماديّات التي استخدمتها في المشروع فالإجابة هي نعم؛ وهذا هو الواقع في أغلب المشاريع.
إن كنت تعمل ضمن فريق مطوّرين فإن جعل الملف composer.lock
في المستودع يضمن أن الجميع يستخدم نفس الإصدارات؛ الأمر الذي يمكن أن يكون مفيدا في تنقيح Debugging الأخطاء التي تظهر لدى مطوّر واحد فقط من الفريق.
إن كنت توزّع تطبيقك عبر Git فإن تضمين الملف composer.lock
في المستودع سيضمن أن إصدارات الاعتماديّات التي استخدمتها في التطوير وأجريت عليها الاختبارات هي نفسها المستخدمة في بيئة الإنتاج.
- لماذا من المهم استخدام نفس إصدارات الاعتماديّات؟
فلنفترض أن Git يتجاهل وجود الملف composer.lock
. تنفّذ الأمر composer install
، يبحث Composer عن آخر ترقيع للإصدار 1.1
من الحزمة templars/shay
فيجد الإصدار 1.1.4
ويثبّته.
تعمل على المشروع باستخدام الإصدار 1.1.4
، وفي هذه الأثناء يقدّم فريق الحزمة templars/shay
الإصدار 1.1.5
الذي - لسوء الحظ - يتضمّن علة برمجيّة Bug حرجة. عندما تنشُر مشروعك على بيئة الإنتاج يثبّت Composer - بالاعتماد على تعليمات الملف composer.json
- الإصدار 1.1.5
من الحزمة الذي يحوي علّة تمنع تطبيقك من العمل على النحو الذي تريده.
يمكنك استنتاج أنه لو كان الملف composer.json
في المستودع لأدّى تنفيذ الأمر composer install
في بيئة الإنتاج إلى تثبيت الإصدار 1.1.4
من الحزمة templars/shay
الذي سبق لك اختبار التطبيق معه.
باختصار:
Quoteيضمن الملف
composer.lock
أن إصدارات الاعتماديّات التي ستُثبَّت حسب مستوى يصل في دقّته الإيداعات الفرديّة للحزم.
-
في الأخير.. متى يتغيّر الملف
composer.lock
ولأي سبب؟
أرى طوال الوقت مطورين ينفّذون الأمر composer update
كلّما حدّثوا الملف composer.json
، للحصول على الحزم الجديدة التي أضافوها إلى الملف. في الواقع هذا الأمر خاطئ! يجب أن تستخدم الأمر composer install
بدلا من ذلك، إذ أنه يثبّت الحزم الجديدة دون تحديث إصدارات الحزم الأخرى؛ هذه الطريقة آمن كثيرا.
في ما يلي لائحة بإجراءات تتسبّب في تحديث الملف composer.lock
:
-
تنفيذ الأمر
composer install
للمرة الأولى. يُنشَأ الملفcomposer.lock
لتسجيل الإصدارات الدقيقة للاعتماديّات المثبّتة. -
تنفيذ الأمر
composer install
بعد إضافة حزم جديدة. يُضاف الإصدار الدقيق للحزمة إلى الملفcomposer.lock
. -
تنفيذ الأمر
composer update
. تُحدَّث إصدارات جميع الحزم إلى الترقيع الأخير بما يتوافق مع تعليمات الملفcomposer.json
، وهو ما ينتُج عنه تحديث الإصدارات الدقيقة في الملفcomposer.lock
. -
تنفيذ الأمر
composer update package/name
لتحديث الحزمة المذكورة إلى آخر ترقيع، بما يتوافق مع تعليمات الملفcomposer.json
، وبالتالي يُحدَّث الملفcomposer.lock
ليعكس التغيير الحاصل في إصدار الحزمة.
يعني ما سبق أن composer install
أمر “آمن”، ولن ينتُج عنه سوى إضافة حزم جديدة إلى الملف composer.lock
(وليس تحديث حزم موجودة مسبقا). في حين أن الأمر composer update
أمر “خطِر”، إذ أنه يتسبّب في تغيير مباشر على الإصدارات الدقيقة الموجودة في الملف composer.lock
.
أرجو أن يكون الملف اللغز composer.lock
قد اتّضح لك بعد قراءة هذا المقال. إن كنت تعلّمت شيئا أو اثنين من هذا المقال فأرجو أن تشاركه مع أصدقائك حتى يعرفوا هم أيضا سر الملف العظيم.
ترجمة - بتصرّف - للمقال PHP: The Composer Lock File لصاحبه Dayle Rees.
حقوق خلفية الصورة البارزة محفوظة لـ Freepik
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.