جحيم التبعيات
"جحيم التبعيات" هو مصطلح عامي يُستخدم لوصف الإحباط الذي يعاني منه بعض مستخدمي البرامج الذين قاموا بتثبيت حزم برامج تعتمد على إصدارات محددة من حزم برامج أخرى . [ 1 ]
تنشأ مشكلة التبعية عندما تعتمد عدة حزم برمجية على نفس الحزم أو المكتبات المشتركة ، ولكنها تعتمد على إصدارات مختلفة وغير متوافقة من هذه الحزم. إذا كان بالإمكان تثبيت الحزمة أو المكتبة المشتركة بإصدار واحد فقط، فقد يحتاج المستخدم إلى حل المشكلة عن طريق الحصول على إصدارات أحدث أو أقدم من الحزم التابعة. وهذا بدوره قد يؤدي إلى تعطيل تبعيات أخرى ونقل المشكلة إلى مجموعة أخرى من الحزم.
مشاكل
تتخذ مشكلة الاعتماد المفرط أشكالاً عديدة:
العديد من التبعيات
- يعتمد التطبيق على العديد من المكتبات ، مما يتطلب تنزيلات طويلة ومساحة تخزين كبيرة، بالإضافة إلى سهولة نقله (حيث أن جميع المكتبات مُعدّة مسبقًا، مما يُسهّل نقل التطبيق نفسه). وقد يكون من الصعب أيضًا تحديد جميع التبعيات، وهو ما يُمكن حله بإنشاء مستودع (انظر أدناه). هذا أمرٌ لا مفر منه جزئيًا؛ فالتطبيق المبني على منصة حوسبة معينة (مثل Java ) يتطلب تثبيت تلك المنصة، بينما لا تتطلبها التطبيقات الأخرى. وتُصبح هذه مشكلة خاصة إذا كان التطبيق يستخدم جزءًا صغيرًا من مكتبة كبيرة (وهو ما يُمكن حله بإعادة هيكلة الكود )، أو إذا كان تطبيق بسيط يعتمد على العديد من المكتبات. [ 2 ]
سلاسل طويلة من التبعيات
- إذا كان التطبيق يعتمد على مكتبة liba ، التي بدورها تعتمد على مكتبة libb ، وهكذا، والتي تعتمد على مكتبة libz ، فهذا يختلف عن "التبعيات المتعددة" التي تتطلب حل التبعيات يدويًا، على سبيل المثال، عند محاولة تثبيت التطبيق ، يُطلب من المستخدم تثبيت liba أولًا، وعند محاولة تثبيت liba ، يُطلب منه تثبيت libb ، وهكذا. مع ذلك، قد تنشأ أحيانًا تعارضات خلال هذه السلسلة الطويلة من التبعيات، حيث يلزم وجود نسختين مختلفتين من الحزمة نفسها [ 3 ] (انظر التبعيات المتعارضة أدناه). يمكن حل هذه السلاسل الطويلة من التبعيات باستخدام مدير حزم يحل جميع التبعيات تلقائيًا. فضلًا عن كونه أمرًا مزعجًا (لحل جميع التبعيات يدويًا)، قد يُخفي الحل اليدوي حلقات التبعيات أو التعارضات.
التبعيات المتضاربة
- قد يؤدي حل تبعيات برنامج ما إلى تعطيل توافق برنامج آخر، تمامًا كما في لعبة "ضرب الخلد" . فإذا كان التطبيق الأول يعتمد على مكتبة libfoo 1.2، والتطبيق الثاني يعتمد على libfoo 2.0، ولا يمكن تثبيت إصدارات مختلفة من libfoo في الوقت نفسه، فلن يكون بالإمكان استخدام التطبيقين معًا (أو تثبيتهما، إذا كان برنامج التثبيت يتحقق من التبعيات). وعند الإمكان، يُحل هذا الأمر بالسماح بتثبيت التبعيات المختلفة في آنٍ واحد. أو بدلاً من ذلك، يجب إلغاء تثبيت التبعية الحالية، بالإضافة إلى جميع البرامج التي تعتمد عليها، لتثبيت التبعية الجديدة. ومن المشاكل التي تواجه أنظمة لينكس عند تثبيت حزم من موزع مختلف، أن سلسلة التبعيات الطويلة الناتجة قد تؤدي إلى إصدار متعارض من مكتبة C القياسية (مثل مكتبة GNU C )، التي تعتمد عليها آلاف الحزم. وفي هذه الحالة، سيُطلب من المستخدم إلغاء تثبيت جميع تلك الحزم.
التبعيات الدائرية
- إذا كان التطبيق (أ) يعتمد على إصدار محدد من التطبيق (ب) ولا يمكنه العمل بدونه ، وكان التطبيق (ب ) بدوره يعتمد على إصدار محدد من التطبيق (أ) ولا يمكنه العمل بدونه ، فإن ترقية أي تطبيق ستؤدي إلى تعطل الآخر. قد يكون هذا المخطط أكثر تعقيدًا في التفرعات. وقد يكون تأثيره بالغًا إذا أثر على الأنظمة الأساسية أو برنامج التحديث نفسه: فمدير الحزم ( أ )، الذي يتطلب مكتبة وقت تشغيل محددة ( ب ) ليعمل، قد يتعطل هو نفسه ( أ ) أثناء عملية ترقية هذه المكتبة ( ب ) إلى الإصدار التالي. وبسبب إصدار المكتبة ( ب ) غير الصحيح، يتعطل مدير الحزم ( أ )، وبالتالي لا يمكن التراجع عن الترقية أو الرجوع إلى إصدار أقدم من المكتبة ( ب ). الحل المعتاد هو تنزيل كلا التطبيقين ونشرهما، أحيانًا من بيئة مؤقتة.
تبعيات مدير الحزم
- من الممكن [ 4 ] أن ينتج عن تثبيت حزمة مُعدة مسبقًا عبر مدير حزم (مثل APT ) مشكلة تعارض التبعيات، ولكن هذا غير مرجح نظرًا لنضج مديري الحزم الرئيسيين وصيانة المستودعات الرسمية بشكل جيد. وينطبق هذا على الإصدارات الحالية من دبيان ومشتقاتها الرئيسية مثل أوبونتو . مع ذلك، قد ينتج عن تثبيت حزمة مباشرةً عبر مُثبِّت حزم (مثل مدير حزم RPM أو dpkg ) مشكلة تعارض التبعيات .
الاعتماد على الماس
- عندما تعتمد المكتبة A على المكتبتين B و C ، فإن كلاً من B و C تعتمد على المكتبة D ، ولكن B تتطلب الإصدار D.1 و C تتطلب الإصدار D.2 . تفشل عملية البناء لأنه لا يمكن أن يوجد في الملف التنفيذي النهائي إلا إصدار واحد من D.
- تُعد برامج إدارة الحزم مثل yum [ 5 ] عرضة للتعارضات بين حزم مستودعاتها، مما يتسبب في جحيم التبعيات في توزيعات Linux مثل CentOS و Red Hat Enterprise Linux .
الحلول
إزالة التبعيات
- تُكتب العديد من مكتبات البرامج بطريقة شاملة، سعيًا لتلبية احتياجات معظم المستخدمين، ولكن في بعض الأحيان لا يتطلب الأمر سوى جزء صغير من الوظائف في الكود الأساسي. من خلال فحص الكود المصدري، يمكن إعادة كتابة الوظائف بطريقة أكثر اختصارًا (مع مراعاة شروط الترخيص). بشكل عام، يُمكن لهذا أن يُقلل بشكل كبير من حجم كود التطبيق، ويُخفض تكاليف الصيانة اللاحقة، ويُحسّن مهارات كتابة البرامج لدى المبرمجين.
ترقيم الإصدارات
- يُعدّ نظام الترقيم الموحد حلاً شائعاً لهذه المشكلة، حيث يستخدم البرنامج رقماً محدداً لكل إصدار (يُعرف أيضاً بالإصدار الرئيسي )، ورقماً فرعياً لكل مراجعة (يُعرف أيضاً بالإصدار الثانوي )، على سبيل المثال: 10.1 أو 5.7 . لا يتغير الإصدار الرئيسي إلا عندما تصبح البرامج التي تستخدمه غير متوافقة. أما الإصدار الثانوي، فقد يتغير حتى مع مراجعة بسيطة لا تمنع البرامج الأخرى من العمل معه. في مثل هذه الحالات، يمكن لحزم البرامج ببساطة طلب مكون يحمل إصداراً رئيسياً معيناً، وأي إصدار ثانوي (أكبر من أو يساوي إصداراً ثانوياً معيناً). وبذلك، ستستمر هذه الحزم في العمل، وسيتم حل التبعيات بنجاح، حتى في حال تغير الإصدار الثانوي. يُعدّ الترقيم الدلالي (المعروف أيضاً باسم "SemVer" [ 6 ] ) مثالاً على الجهود المبذولة لإنشاء مواصفات فنية تستخدم أرقاماً مُنسقة خصيصاً لإنشاء نظام ترقيم إصدارات البرامج.
إصدارات خاصة لكل تطبيق
- منعت ميزة حماية ملفات ويندوز ، التي طُرحت في ويندوز 2000 ، التطبيقات من الكتابة فوق مكتبات الارتباط الديناميكي (DLLs) الخاصة بالنظام. وبدلاً من ذلك، شُجّع المطورون على استخدام مكتبات الارتباط الديناميكي الخاصة، وهي نسخ مكررة من مكتبات الارتباط الديناميكي الخاصة بالنظام والمخزنة في مجلد البرنامج. ويتطلب هذا تضمين التبعيات المخصصة مع البرنامج، مما يمنع حدوث مشاكل التبعيات. [ 7 ]
- يضع نظام التشغيل PC-BSD، حتى الإصدار 8.2 (بما في ذلك هذا الإصدار)، وهو نظام سابق لنظام TrueOS ( نظام تشغيل مبني على FreeBSD )، الحزم والتبعيات في مجلدات مستقلة ضمن مجلد /Programs ، مما يمنع حدوث أعطال في حال ترقية مكتبات النظام أو تغييرها. ويستخدم النظام مُثبِّتًا خاصًا به (PBI) لإدارة الحزم. [ 8 ]
تثبيت إصدارات متعددة جنبًا إلى جنب
- يمكن تحسين حل ترقيم الإصدارات بجعله ميزة مدعومة من نظام التشغيل. يتيح ذلك للتطبيق طلب وحدة/مكتبة باسم فريد ورقم إصدار محدد، ما ينقل فعليًا مسؤولية إدارة إصدارات المكتبة/الوحدة من التطبيقات إلى نظام التشغيل. عندئذٍ، يمكن وضع وحدة مشتركة في مستودع مركزي دون خطر تعطيل التطبيقات التي تعتمد على إصدارات سابقة أو لاحقة منها. يحصل كل إصدار على مدخل خاص به، جنبًا إلى جنب مع الإصدارات الأخرى من الوحدة نفسها.
- يُستخدم هذا الحل في أنظمة تشغيل مايكروسوفت ويندوز منذ ويندوز فيستا، حيث تُعدّ ذاكرة التجميع العامة (Global Assembly Cache) تطبيقًا لسجل مركزي كهذا مع خدمات مرتبطة به، وهي مُدمجة مع نظام التثبيت/مدير الحزم. أما نظام جنتو لينكس، فيحلّ هذه المشكلة بمفهوم يُسمى "التخزين المؤقت" (slotting)، والذي يسمح بتثبيت إصدارات متعددة من المكتبات المشتركة. [ 9 ]
إدارة الحزم الذكية
- يمكن لبعض مديري الحزم إجراء ترقيات ذكية، حيث يتم ترقية مكونات البرامج المترابطة في نفس الوقت، مما يؤدي إلى حل مشكلة عدم توافق الأرقام الرئيسية أيضًا.
- قامت العديد من توزيعات لينكس الحالية بتطبيق أنظمة إدارة الحزم القائمة على المستودعات لحل مشكلة التبعيات. تُشكل هذه الأنظمة طبقةً فوق مدير حزم RPM (RPM) أو dpkg أو غيرها من أنظمة التغليف، وهي مصممة لحل التبعيات تلقائيًا من خلال البحث في مستودع برمجيات واحد أو أكثر مُحدد مسبقًا . من أمثلة هذه الأنظمة: أداة التغليف المتقدمة ( APT )، و Yum ، وUrpmi ، وZYpp ، و Portage ، و Pacman ، وغيرها. عادةً ما تكون مستودعات البرمجيات عبارة عن مواقع بروتوكول نقل الملفات (FTP) أو مواقع ويب، أو مجلدات على الحاسوب المحلي أو مشتركة عبر الشبكة ، أو في حالات أقل شيوعًا، مجلدات على وسائط تخزين قابلة للإزالة مثل الأقراص المدمجة (CD) أو أقراص DVD. يُزيل هذا مشكلة التبعيات المعقدة للبرامج المُعبأة في هذه المستودعات، والتي عادةً ما يُديرها مُزود توزيعة لينكس ويتم نسخها عالميًا. على الرغم من أن هذه المستودعات غالبًا ما تكون ضخمة، إلا أنه من غير الممكن احتواء جميع البرامج فيها، لذا قد تظل مشكلة التبعيات قائمة. في جميع الأحوال، لا يزال القائمون على صيانة المستودعات يواجهون مشكلة التبعيات المعقدة. [ 4 ]
خيارات المُثبِّت
- نظراً لاختلاف التبعيات بين البرامج المختلفة، قد يقع المستخدم في حلقة مفرغة من متطلبات التبعية، أو ما يُعرف بشجرة المتطلبات المتنامية باستمرار ، حيث يتطلب كل برنامج جديد تثبيت المزيد من البرامج. تستطيع أنظمة مثل أداة إدارة الحزم المتقدمة ( APT ) في دبيان حل هذه المشكلة من خلال عرض مجموعة من الحلول للمستخدم، والسماح له بقبولها أو رفضها حسب رغبته.
سهولة التكيف في البرمجة
- إذا صُممت برامج التطبيقات بطريقة تُمكّن مبرمجيها من تكييف واجهة المستخدم، التي تتعامل مع نظام التشغيل أو مدير النوافذ أو بيئة سطح المكتب، بسهولة مع المعايير الجديدة أو المتغيرة، فلن يحتاج المبرمجون إلا إلى متابعة الإشعارات الواردة من مُنشئي البيئة أو مصممي مكتبات المكونات، وتحديث برامجهم بسرعة لتوفير التحديثات للمستخدمين، كل ذلك بأقل جهد ممكن ودون الحاجة إلى إعادة تصميم مكلفة ومُستهلكة للوقت. هذه الطريقة تُشجع المبرمجين على الضغط على الجهات التي يعتمدون عليها للحفاظ على آلية إشعارات فعّالة لا تُرهق أيًا من الأطراف المعنية.
متطلبات التوافق الصارمة في تطوير وصيانة التعليمات البرمجية
- إذا طُوّرت التطبيقات والمكتبات وصيانتها مع مراعاة التوافق مع الإصدارات السابقة، يُمكن استبدال أي تطبيق أو مكتبة بإصدار أحدث في أي وقت دون حدوث أي مشاكل. ورغم أن هذا لا يُزيل كثرة التبعيات، إلا أنه يُسهّل عمل مديري الحزم أو برامج التثبيت بشكل كبير.
أجهزة البرمجيات
- يتمثل أحد الأساليب الأخرى لتجنب مشاكل التبعيات في نشر التطبيقات كأجهزة برمجية متكاملة . يُغلف هذا النوع من الأجهزة التبعيات في وحدة متكاملة مُسبقًا، بحيث لا يضطر المستخدمون إلى القلق بشأن حل تبعيات البرامج. بدلاً من ذلك، ينتقل هذا العبء إلى مطوري الجهاز البرمجي. ويمكن اعتبار الحاويات وصورها (مثل تلك التي يوفرها Docker وDocker Hub) بمثابة تطبيق عملي للأجهزة البرمجية المتكاملة.
تطبيقات محمولة
- تطبيق (أو نسخة من تطبيق تقليدي موجود) مكتفٍ ذاتيًا تمامًا ولا يتطلب تثبيت أي شيء مسبقًا. يُبرمج بحيث يتضمن جميع المكونات الضرورية، أو يُصمم بحيث يحتفظ بجميع الملفات الضرورية ضمن دليله الخاص، ولن يُسبب أي مشكلة تبعية. غالبًا ما تكون هذه التطبيقات قادرة على العمل بشكل مستقل عن النظام المتصل به. تستخدم التطبيقات في نظامي RISC OS و ROX Desktop لنظام Linux أدلة التطبيقات ، والتي تعمل بطريقة مشابهة: حيث تكون البرامج وتوابعها مكتفية ذاتيًا في أدلة (مجلدات) خاصة بها. [ 10 ]
- أثبتت هذه الطريقة في التوزيع جدواها عند نقل التطبيقات المصممة لمنصات شبيهة بنظام يونكس إلى نظام ويندوز، مع أن أبرز عيوبها هو الحاجة إلى تثبيتات متعددة لنفس المكتبات المشتركة . على سبيل المثال، تتضمن برامج التثبيت الخاصة بنظام ويندوز لبرامج gedit و GIMP و HexChat نسخًا متطابقة من مجموعة أدوات GTK ، التي تستخدمها هذه البرامج لعرض عناصر واجهة المستخدم الرسومية. من ناحية أخرى، إذا تطلب كل تطبيق إصدارات مختلفة من GTK، فإن هذا هو السلوك الصحيح، ويتجنب بنجاح مشكلة التبعيات المعقدة.
خاص بالمنصة
في منصات الحوسبة المحددة ، غالباً ما يُعرف مصطلح "جحيم التبعيات" باسم محلي محدد، وهو عادةً اسم المكونات.
- جحيم DLL - شكل من أشكال جحيم التبعيات الذي يحدث على نظام التشغيل Microsoft Windows ذي 16 بت .
- تعارض الامتدادات - شكل من أشكال جحيم التبعيات الذي يحدث في نظام التشغيل Mac OS الكلاسيكي .
- جحيم ملفات JAR - شكل من أشكال جحيم التبعيات الذي كان يحدث في بيئة تشغيل جافا قبل أن تحل أدوات البناء مثل Apache Maven هذه المشكلة في عام 2004.
- جحيم RPM – شكل من أشكال جحيم التبعيات الذي يحدث في توزيعة Red Hat لنظام Linux والتوزيعات الأخرى التي تستخدم RPM كمدير حزم. [ 11 ]
انظر أيضاً
- المأزق 22 – هو موقف يعتمد فيه حل المشكلة على ظروف متناقضة، وقد سمي بهذا الاسم نسبةً إلى مفهوم ورد في رواية صدرت عام 1961
- إدارة التكوين – تقنيات وأدوات لإدارة إصدارات البرامج
- الترابط – أشكال التبعية بين مكونات البرمجيات
- إزالة التعليمات البرمجية الميتة الديناميكية
- مدير الحزم
- بي بي آي
- تطبيق برمجي
- المكتبة الثابتة
- هجوم على سلسلة التوريد
- نيكس (مدير الحزم)
- حادثة npm left-pad
مراجع
- ↑ مايكل جانغ (2006). مضايقات لينكس للمهوسين . دار نشر أورايلي ميديا، ص 325. رقم ISBN 9780596552244تم الاطلاع عليه بتاريخ 16 فبراير 2012 .
- ↑ دونالد، جيمس (25 يناير 2003). "تحسين قابلية نقل المكتبات المشتركة" (ملف PDF) . جامعة برينستون . مؤرشف من الأصل (ملف PDF) بتاريخ 26 سبتمبر 2007. تم الاطلاع عليه بتاريخ 9 أبريل 2010 .
- ↑ ستيفنز، آل (1 مايو 2001). "إنه عمل جيد عندما تجده: دوامة التبعية" . مجلة J-DDJ . 26 (5): 121-124 . ISSN 1044-789X . مؤرشف من الأصل في 11 أغسطس 2011. تم الاطلاع عليه في 10 أبريل 2010 عبر drdobbs.com/blog.
- 1 2 بيوتر برينس؛ جيفا سوريش وإيلكو دولسترا (22-12-2008). "نيكس يُصلح مشكلة التبعيات المُعقدة في جميع توزيعات لينكس" . linux.com . مؤرشف من الأصل في 8-7-2015 . تم الاطلاع عليه في 22-5-2013 .
تُعاني جميع مديري الحزم الشائعة، بما في ذلك APT وRPM ومجموعة منافذ FreeBSD، من مشكلة التحديثات المُدمرة. عند إجراء ترقية - سواء لتطبيق واحد أو لنظام التشغيل بأكمله - سيقوم مدير الحزم باستبدال الملفات الموجودة حاليًا على نظامك بإصدارات أحدث. طالما أن الحزم متوافقة تمامًا مع الإصدارات السابقة، فلا تُشكل هذه مشكلة، ولكن في الواقع، الحزم ليست متوافقة تمامًا مع الإصدارات السابقة. لنفترض أنك تُحدّث فايرفوكس، وقرر مدير الحزم أنك بحاجة إلى إصدار أحدث من GTK أيضًا. إذا لم يكن GTK الجديد متوافقًا تمامًا مع الإصدارات السابقة، فقد تتعطل تطبيقات أخرى على نظامك فجأة. في بيئة ويندوز، تُعرف مشكلة مماثلة باسم "جحيم DLL"، لكن "جحيم التبعيات" يُعد مشكلة مماثلة في بيئة يونكس، إن لم تكن أكبر، لأن برامج يونكس تميل إلى الاعتماد على العديد من المكتبات الخارجية.
- ↑ "جحيم الإدمان على الطعام اللذيذ" . مؤرشف من الأصل بتاريخ 19-12-2016 . تم الاطلاع عليه بتاريخ 28-12-2015 .
- ↑ "موقع المشروع الإلكتروني: semver.org" .
- ↑ أندرسون، ريك (11 يناير 2000). "نهاية جحيم ملفات DLL" . Microsoft.com . مؤرشف من الأصل في 5 يونيو 2001. تم الاطلاع عليه في 7 يوليو 2010 .
- ↑ "دليل pbi" . مؤرشف من الأصل بتاريخ 27-03-2013.
- ↑ "Slotting" . gentoo.org . تم الاطلاع عليه بتاريخ 10-03-2025 .
- ↑ "أدلة التطبيقات" . تم الاطلاع عليه بتاريخ 7 سبتمبر 2013 .
- ↑ وينشتاين، بول (11 سبتمبر 2003). "هل نظام لينكس مزعج؟" . linuxdevcenter.com . تاريخ الاسترجاع: 10 أبريل 2010 .
فئات :
- أنظمة إدارة الحزم
- أنظمة التحكم في الإصدارات
- أخطاء الحاسوب
- حكايات شعبية في هندسة البرمجيات
