تخطيط تبعيات البناء للبنية الأساسية لبرنامج ربط العمليات التجارية الخاصة بك

مكتمل

في هذه الوحدة، ستتعرف على تعليمات التعبئة البرمجية لتسهيل مشاركتها. ستكتشف لماذا يجب عليك إنشاء الحزم وأنواع الحزم التي يمكنك إنشاؤها، وأين يمكنك استضافة الحزم، وكيف يمكنك الوصول إليها عند استضافتها. ستتعرف أيضاً على تعيين إصدار الحزمة.

تنمو قواعد التعليمات البرمجية دائما بشكل أكبر وأكثر تعقيدا. من غير المعتاد أن يكتب الفريق جميع التعليمات البرمجية التي يستخدمها تطبيقه. بدلا من ذلك، يتضمن الفريق التعليمات البرمجية الموجودة التي كتبها مطورون آخرون. يمكن أن يكون هناك العديد من هذه الحزم أو التبعيات في التطبيق. من المهم إدارة هذه التبعيات بنشاط لتكون قادرا على الاحتفاظ بها بشكل صحيح والتأكد من أنها تفي بمتطلبات الأمان.

أولاً، لنتحقق ونرى كيف يعمل الفريق. دعا أندي الفريق معا للتحدث عن تغيير محتمل في التعليمات البرمجية الخاصة بهم من شأنه أن يساعد فريقا آخر.

اجتماع الفريق

أندي: مرحبا بالجميع. كنت أتحدث مع الفريق الذي يعمل على نظام النهاية الخلفية للعبة الفضاء. يمكنهم استخدام النماذج التي نستخدمها لموقع الويب في تطبيق خلفي يخططون لكتابته.

أميتا: ماذا تعني بالنماذج؟

أندي: كما تعلمون، فإن موقع Space Game هو تطبيق ASP.NET Core. ويستخدم نمط Model-View-Controller - أو MVC - لفصل البيانات عن كيفية عرض تلك البيانات في واجهة المستخدم. كنت أفكر في أنه يمكننا إنشاء حزمة تحتوي على فئات النموذج لدينا بحيث يمكن لأي تطبيق استخدامها.

أميتا: ما هو الهدف بالضبط؟

أندي: سيشارك كلا فريقينا نفس قاعدة البيانات. ترسل اللعبة قاعدة البيانات درجات عالية؛ نقرأ هذه الدرجات لعرضها على لوحة المتصدرين.

أميتا: هذا أمر منطقي. كيف سننشئ هذه الحزمة؟

أندي: لهذا أردت الدردشة معك. لدينا بعض الخيارات، وأنا أبحث عن أفكار.

تيم: أود المساعدة، ولكن لدي أولا بعض الأسئلة. أنا جديد على هذا وأريد أن أفهم كيف يعمل كل شيء.

ما هي الحزمة؟

تحتوي الحزمة على تعليمات برمجية قابلة لإعادة الاستخدام يمكن للمطورين الآخرين استخدامها في مشاريعهم الخاصة، على الرغم من أنهم لم يكتبوها.

بالنسبة للغات المحولة برمجيا، تحتوي الحزمة عادة على التعليمات البرمجية الثنائية المحولة برمجيا، مثل ملفات .dll في .NET أو ملفات .class في Java. بالنسبة للغات التي يتم تفسيرها بدلا من تحويلها برمجيا، مثل JavaScript أو Python، قد تتضمن الحزمة التعليمات البرمجية المصدر.

وفي كلتا الحالتين، عادة ما يتم ضغط الحزم إلى ZIP أو تنسيق مشابه. غالبا ما تحدد أنظمة الحزم ملحق ملف فريد، مثل .nupkg أو .jar، لتوضيح استخدام الحزمة. يمكن أن يساعد الضغط في تقليل وقت التنزيل، كما يكون الناتج عبارة عن ملف واحد لتبسيط الإدارة.

غالبا ما تحتوي الحزم أيضا على ملف واحد أو أكثر يوفر بيانات تعريف أو معلومات حول الحزمة. قد تصف بيانات التعريف هذه ما تفعله الحزمة، وتحدد شروط الترخيص الخاصة بها، ومعلومات جهة اتصال الكاتب، وإصدار الحزمة.

لماذا يجب إنشاء حزمة؟

هناك مزايا لإنشاء حزمة بدلا من تكرار التعليمات البرمجية.

أحد أسباب إنشاء حزمة بدلا من تكرار التعليمات البرمجية هو منع الانجراف. عند تكرار التعليمات البرمجية، يمكن أن تتباعد كل نسخة بسرعة لتلبية متطلبات تطبيق معين. يصبح من الصعب ترحيل التغييرات من نسخة إلى أخرى. بمعنى آخر، تفقد القدرة على تحسين التعليمات البرمجية بطرق تفيد الجميع.

تقوم الحزم أيضا بتجميع الوظائف ذات الصلة في مكون واحد قابل لإعادة الاستخدام. اعتمادا على لغة البرمجة، يمكن أن توفر الحزمة للتطبيقات إمكانية الوصول إلى أنواع ووظائف معينة، مع تقييد الوصول إلى تفاصيل التنفيذ الخاصة بها.

سبب آخر لإنشاء حزمة هو توفير طريقة متسقة لبناء واختبار وظائف تلك الحزمة. عند تكرار التعليمات البرمجية، قد يقوم كل تطبيق بإنشاء هذه التعليمة البرمجية واختبارها بطرق مختلفة. قد تتضمن مجموعة واحدة من الاختبارات عمليات التحقق التي يمكن لمجموعة أخرى الاستفادة منها.

وتتمثل إحدى المزايا في توفر قاعدة بيانات أخرى للاختبار والمحافظة عليها مع الحزمة. يجب أن تكون حذرا أيضا عند إضافة الميزات. بشكل عام، يجب أن تحتوي الحزمة على ميزات تفيد أنواعا عديدة من التطبيقات. على سبيل المثال، Json.NET هي حزمة NuGet شائعة ل .NET تسمح لك بالعمل مع ملفات JSON. Json.NET مصدر مفتوح، بحيث يمكن للمجتمع اقتراح التحسينات والإبلاغ عن القضايا.

عندما يمكن لتطبيقات متعددة الاستفادة من نفس التعليمات البرمجية، فإن المزايا تفوق بكثير العيوب. لديك قاعدة تعليمات برمجية واحدة فقط، ومجموعة واحدة فقط من الاختبارات، وعملية بناء واحدة فقط لإدارتها.

كيف يمكنني تحديد التبعيات؟

إذا كان الهدف هو إعادة تنظيم التعليمات البرمجية إلى مكونات منفصلة، فأنت بحاجة إلى تحديد تلك الأجزاء من تطبيقك التي يمكن إزالتها، وتعبئتها لإعادة استخدامها، وتخزينها في موقع مركزي، وتحديد إصدارها. قد ترغب حتى في استبدال التعليمات البرمجية الخاصة بك بمكونات تابعة لجهة خارجية إما مصدر مفتوح أو التي تقوم بترخيصها.

هناك العديد من الطرق لتحديد التبعيات المحتملة في قاعدة التعليمات البرمجية. يتضمن ذلك فحص التعليمات البرمجية بحثًا عن أنماط إعادة الاستخدام، وتحليل بنية الحل. فيما يلي بعض الطرق لتحديد التبعيات:

  • تكرار التعليمات البرمجية.

    إذا ظهرت أجزاء معينة من التعليمات البرمجية في عدة أماكن، وهذا مؤشر جيد على أنه يمكنك إعادة استخدام التعليمات البرمجية. مركزية هذه الأجزاء المكررة من التعليمات البرمجية وإعادة حزمها بشكل مناسب.

  • التماسك العالي والاقتران المنخفض.

    النهج الثاني هو البحث عن عناصر التعليمات البرمجية التي لها تماسك عال لبعضها البعض واقتران منخفض مع أجزاء أخرى من التعليمات البرمجية. في جوهرها، يعني التماسك العالي الاحتفاظ بأجزاء من قاعدة التعليمات البرمجية المرتبطة ببعضها البعض في مكان واحد. الاقتران المنخفض، في نفس الوقت، يتعلق بفصل الأجزاء غير المرتبطة من قاعدة التعليمات البرمجية قدر الإمكان.

  • دورة حياة فردية.

    ابحث عن أجزاء من التعليمات البرمجية التي لها دورة حياة مشابهة يمكنك نشرها وإصدارها بشكل فردي. إذا كان يمكن الحفاظ على هذه التعليمة البرمجية من قبل فريق منفصل، فهذا مؤشر جيد على أنه يمكنك حزمها كمكون خارج الحل.

  • أجزاء مستقرة.

    قد تكون بعض أجزاء قاعدة التعليمات البرمجية مستقرة وتتغير بشكل غير متكرر. تحقق من مستودع التعليمات البرمجية للعثور على التعليمات البرمجية بتردد تغيير منخفض.

  • التعليمات البرمجية والمكونات المستقلة.

    عندما تكون التعليمات البرمجية والمكونات مستقلة وغير مرتبطة بأجزاء أخرى من النظام، يمكنك عزلها إلى تبعيات منفصلة.

يمكنك استخدام أدوات مختلفة لمساعدتك في مسح وفحص قاعدة التعليمات البرمجية. تتراوح هذه الأدوات من الأدوات التي تفحص التعليمات البرمجية المكررة ورسم الرسوم البيانية لتبعية الحل إلى الأدوات التي يمكنها حساب المقاييس للاقتران والتماسك.

ما أنواع الحزم الموجودة؟

توفر كل لغة برمجة أو إطار عمل طريقتها الخاصة لبناء الحزم. توفر أنظمة الحزم الشائعة وثائق حول كيفية عمل العملية.

قد تكون على دراية بأنظمة الحزم الشائعة هذه:

  • NuGet: حزم مكتبات .NET
  • NPM: يحزم مكتبات JavaScript
  • Maven: حزم مكتبات Java
  • Docker: يحزم البرمجيات في وحدات معزولة تسمى حاويات

أين تتم استضافة الحزم؟

يمكنك استضافة الحزم على شبكتك الخاصة، أو يمكنك استخدام خدمة استضافة. غالبا ما تسمى خدمة الاستضافة مستودع حزمة أو سجل حزمة. توفر العديد من هذه الخدمات استضافة مجانية للمشاريع مفتوحة المصدر.

فيما يلي بعض خدمات الاستضافة الشائعة وأنواع الحزم التي وصفناها للتو:

  • معرض NuGet

    يتم استخدام حزم NuGet للبيانات الاصطناعية للتعليمات البرمجية .NET. تتضمن هذه البيانات الاصطناعية تجميعات .NET والملفات ذات الصلة والأدوات، وأحيانا بيانات التعريف. يحدد NuGet الطريقة التي يتم بها إنشاء الحزم وتخزينها واستهلاكها. حزمة NuGet هي في الأساس بنية مجلد مضغوط مع ملفات بتنسيق ZIP ولها ملحق .nupkg .

  • NPM

    يتم استخدام حزمة NPM ل JavaScript. حزمة NPM هي ملف أو مجلد يحتوي على ملفات JavaScript وملف package.json يصف بيانات تعريف الحزمة. بالنسبة إلى node.js، تحتوي الحزمة عادة على وحدة نمطية واحدة أو أكثر يمكن تحميلها بعد استهلاك الحزمة.

  • مستودع Maven المركزي

    يستخدم Maven للمشاريع القائمة على Java. تحتوي كل حزمة على ملف Project Object Model يصف بيانات تعريف المشروع، وهو الوحدة الأساسية لتعريف حزمة والعمل معها.

  • Docker Hub

    تسمى حزم Docker الصور، وتحتوي على عمليات نشر كاملة ومكتفية ذاتيا. الأكثر شيوعا، تمثل صورة Docker مكون برنامج يمكن استضافته وتنفيذه بنفسه، دون أي تبعيات على الصور الأخرى. تكون صور Docker ذات طبقات وقد تعتمد على صور أخرى.

يشير موجز الحزمة إلى خادم مستودع الحزمة. يمكن أن يكون هذا الخادم على الإنترنت أو خلف جدار الحماية على شبكتك. على سبيل المثال، يمكنك استضافة موجزات NuGet الخاصة بك باستخدام منتجات الاستضافة مثل Azure Artifacts وMyGet. يمكنك أيضا استضافة الحزم على مشاركة ملف.

عند استضافة الحزم خلف جدار الحماية، يمكنك تضمين موجزات لحزمك الخاصة. يمكنك أيضا تخزين الحزم التي تثق بها على شبكتك مؤقتا عندما يتعذر على أنظمتك الاتصال بالإنترنت.

ما هي العناصر التي تشكل استراتيجية جيدة لإدارة التبعيات؟

تعتمد استراتيجية إدارة التبعية الجيدة على هذه العناصر الثلاثة:

  • التوحيد القياسي.

    سيساعد توحيد طريقة إعلان التبعيات وحلها على أن تظل عملية الإصدار التلقائية قابلة للتكرار ويمكن التنبؤ بها.

  • تنسيقات التغليف والمصادر.

    يجب حزم كل تبعية باستخدام التنسيق القابل للتطبيق وتخزينها في موقع مركزي.

  • تعيين الإصدار.

    تحتاج إلى تتبع التغييرات التي تحدث بمرور الوقت في التبعيات تماما كما تفعل مع التعليمات البرمجية الخاصة بك. وهذا يعني أنه يجب إصدار التبعيات.

روبوت Who يمكنه الوصول إلى الحزم؟

توفر العديد من موجزات الحزم وصولا غير مقيد إلى الحزم. على سبيل المثال، يمكنك تنزيل Json.NET من nuget.org، دون الحاجة إلى تسجيل الدخول أو المصادقة.

تتطلب موجزات الحزم الأخرى المصادقة. يمكنك مصادقة الوصول إلى الموجزات بعدة طرق. على سبيل المثال، تتطلب بعض أنواع الموجزات اسم مستخدم وكلمة مرور. تتطلب الموجزات الأخرى رمز وصول مميز، وهو عادة سلسلة طويلة من الأحرف التي تحدد هويتك وإلى الموارد التي لديك حق الوصول إليها. يمكنك تعيين رموز الوصول المميزة لتنتهي صلاحيتها بعد فترة زمنية معينة.

كيف يتم إصدار الحزم؟

يعتمد نظام تعيين الإصدار على نظام التعبئة والتغليف الذي تستخدمه.

على سبيل المثال، تستخدم حزم NuGet تعيين الإصدار الدلالي.

الإصدار الدلالي هو نظام إصدار شائع. إليك التنسيق:

Major.Minor.Patch[-Suffix]

فيما يلي ما تعنيه كل معلمة من هذه المعلمات:

  • يقدم الإصدار الرئيسي الجديد تغييرات فاصلة. تحتاج التطبيقات عادة إلى تحديث كيفية استخدام الحزمة للعمل مع إصدار رئيسي جديد.
  • يقدم الإصدار الثانوي الجديد ميزات جديدة، ولكنه متوافق مع الإصدارات السابقة.
  • يقدم التصحيح الجديد إصلاحات الأخطاء المتوافقة مع الإصدارات السابقة، ولكن ليس الميزات الجديدة.
  • جزء -Suffix اختياري ويحدد الحزمة كإصدار ما قبل الإصدار. على سبيل المثال، قد يحدد الإصدار 1.0.0-beta1 الحزمة كأول إصدار تجريبي بيتا لإصدار 1.0.0.

عند الرجوع إلى حزمة، يمكنك القيام بذلك حسب رقم الإصدار.

فيما يلي مثال على تثبيت حزمة باستخدام PowerShell ورقم إصدار معين:

Install-Package Newtonsoft.Json -Version 13.0.1

ماذا يحدث عندما تتغير الحزمة؟

عندما تشير إلى حزمة من تطبيقك، فإنك تقوم عادة بتثبيت إصدار تلك الحزمة التي تريد استخدامها أو تحديده.

تتيح لك العديد من أطر العمل تحديد نطاقات مسموح بها من إصدارات الحزمة لتثبيتها. يسمح لك البعض أيضا بتحديد أحرف البدل، والتي نسميها إصدارا عائما.

على سبيل المثال، في NuGet، الإصدار "1.0" يعني الإصدار الأول الذي يساوي أو أكبر من 1.0. يحدد "[1.0]" تثبيت الإصدار 1.0 فقط، وليس إصدارا أحدث.

فيما يلي بعض الأمثلة الأخرى:

هذا التضمين: تحديد:
(1.0,) الإصدار الأول أكبر من 1.
[1.0,2.0] الإصدار الأول أكبر من أو يساوي 1.0، وأقل من أو يساوي 2.0
(1.0,2.0) الإصدار الأول أكبر من 1.0 وأقل من 2.0
[1.0,2.0) الإصدار الأول أكبر من أو يساوي 1.0، وأقل من 2.0

نظرا لأن كل مشرف يصدر إصدار حزمة جديدة، يمكنك تقييم ما تم تغييره واختبار تطبيقك مقابله. عندما تكون مستعدا، يمكنك تحديث رقم إصدار الحزمة في التكوين الخاص بك وإرسال التغيير إلى البنية الأساسية لبرنامج ربط العمليات التجارية للبناء.

إليك مثال على كيفية تضمين حزمة Newtonsoft.Json في ملف (.csproj) لمشروع تطبيق C#. يحدد هذا المثال الإصدار 13.0.1 من تلك الحزمة:

<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

‏‫اختبر معلوماتك

1.

ما هي الحزمة؟

2.

لنفترض أنك أنشأت حزمة تريد مشاركتها بشكل عام. ما هي أسهل طريقة للقيام بذلك؟