JavaRush /مدونة جافا /Random-AR /مقدمة سريعة عن Gradle
Viacheslav
مستوى

مقدمة سريعة عن Gradle

نشرت في المجموعة

مقدمة

سيكون موضوع هذه المراجعة هو نظام البناء التلقائي Gradle. في اللغة الإنجليزية، تسمى أنظمة البناء أدوات البناء . مقدمة سريعة عن Gradle - 1لماذا هذا ضروري حتى؟ يعد إنشاء المشاريع يدويًا في Java عملية كثيفة العمالة إلى حد ما. من الضروري الإشارة بشكل صحيح إلى المكتبات والأطر التي يحتاجها المشروع والتي يعتمد عليها المشروع. هنا يمكنك قراءة مقالة ممتازة عن حبري: " العمل مع Java في سطر الأوامر ". عاجلاً أم آجلاً، ستبدأ في إنشاء بعض البرامج النصية لأتمتة هذه العملية. تخيل الآن أن جميع المطورين في جميع أنحاء العالم يفعلون ذلك وأن الجميع يكتب مرة أخرى ما كتبه شخص ما بالفعل لمشروعهم. ثم ظهرت أنظمة تجميع المشروع التي تعمل على أتمتة هذه العملية. بالإضافة إلى ذلك، من ناحية، فهي تسمح لك بتجميع المشروع بالطريقة التي تريدها، ومن ناحية أخرى، فإنها توفر لك أدوات موحدة أكثر أو أقل. البديل لـ Gradle هو نظام البناء الآلي Maven. إن نظامي التجميع هذين مختلفان من ناحية، ولكن من ناحية أخرى، لديهما عدد من أوجه التشابه. توجد مواد حول هذا الموضوع على موقع Gradle: " الترحيل من Maven إلى Gradle ". كما هو مذكور في هذا البرنامج التعليمي، لدى Gradle وMaven وجهة نظر مختلفة حول كيفية بناء المشروع. يعتمد Gradle على رسم بياني للمهام، والتي يمكن أن تعتمد على بعضها البعض. المهام تقوم بنوع من العمل. يستخدم Maven نموذجًا لمراحل معينة ترتبط بها "أهداف" معينة. هذه الأهداف هي حيث يتم إنجاز بعض العمل. ومع ذلك، مع هذه الأساليب المختلفة، يتبع كلا نظامي البناء نفس الاتفاقية وإدارة التبعية متشابهة. لبدء استخدام Gradle، عليك تنزيله. في Google أو Yandex ندخل إلى "Gradle Build Tool" وفي النتائج الأولى نرى الموقع الرسمي: https://gradle.org . يوجد في صفحة Gradle الرئيسية رابط يحتوي على النص "Docs"، والذي يؤدي إلى وثائق Gradle . أولاً، نحتاج إلى تثبيت (تثبيت) Gradle، لذلك نحن مهتمون بقسم " تثبيت Gradle " في الوثائق. هناك طرق عديدة للتثبيت، منها الطريقة “القديمة”، أي. يدويًا (" التثبيت يدويًا "). وفقًا للتعليمات، قم بتنزيل ملف من النوع " ثنائي فقط "، والذي سيكون له اسم مثل gradle-5.1.1-bin.zip. بعد ذلك، قم بفك ضغط الأرشيف وتكوين متغير بيئة PATH وفقًا للتعليمات. الشيء الرئيسي هو أنه بعد تنفيذ التعليمات، gradle -vيعرض الأمر إصدار Gradle المثبت. قد تكون هناك مشكلة أنه عند تحديد الموقع، سيجد النظام Gradle ليس في المكان الذي تريده. لذلك، يمكنك القيام بذلك على نظام التشغيل Windows (توجد نظائرها في *nix): for %i in (gradle.bat) do @echo. %~$PATH:i الآن، ربما يمكننا البدء في التعرف.
مقدمة سريعة عن Gradle - 2

تهيئة مشروع Gradle

أود أن أشير على الفور إلى أن Gradle يتعلق بأداء مهام تسمى المهام (سأسميها مهام). يتم توفير المهام من خلال المكونات الإضافية المختلفة . أنصحك بقراءة المزيد عن المكونات الإضافية في الوثائق الرسمية: " استخدام مكونات Gradle الإضافية ". توجد مجموعة من "المكونات الإضافية الأساسية" المتوفرة دائمًا عند تثبيت Gradle. هناك فئات مختلفة من هذه المكونات الإضافية، ولكننا مهتمون بفئة " الأدوات المساعدة ". تتضمن هذه المجموعة المكوّن الإضافي " Build Init Plugin "، الذي يوفر مهام لتهيئة مشروع Gradle. نحن مهتمون بإنشاء نوع المشروع: " java-application ". لنقم بتشغيل مهمة Gradle: gradle init --type java-application دعنا نجيب على بعض الأسئلة على طول الطريق، على سبيل المثال، أننا نريد استخدام Groovy DSL (لغة وصف المهمة القياسية لـ Gradle) وإطار اختبار JUnit (سنتحدث عن هذا في مراجعة أخرى). بعد الإنشاء سنتلقى مجموعة الملفات التالية:
مقدمة سريعة عن Gradle - 3
أولاً، بعد التهيئة، نتلقى غلافًا خاصًا تم تكوينه مسبقًا لإصدار Gradle الخاص بنا - وهو برنامج نصي خاص. أنصحك بقراءة المزيد عنها في الوثائق الرسمية - " The Gradle Wrapper ". ثانيًا، نرى Gradle Build Script - ملف build.gradle. هذا هو الملف الرئيسي، الذي يصف المكتبات والأطر التي يستخدمها مشروعنا، والمكونات الإضافية التي يجب توصيلها بالمشروع ويصف المهام المختلفة. أنصحك بقراءة المزيد حول هذا الملف في الوثائق الرسمية: " أساسيات إنشاء البرنامج النصي ".
مقدمة سريعة عن Gradle - 4

الإضافات والمهام

إذا نظرنا الآن إلى محتويات Build Script، فسنرى قسم الإضافات:
plugins {
    id 'java'
    id 'application'
}
هذه هي نفس المكونات الإضافية التي تحدثنا عنها سابقًا. وإذا كانت هناك مكونات إضافية، فهناك مهام متاحة لنا الآن. يمكننا تشغيل أمر مهام gradle ومعرفة ما يمكننا فعله الآن بالمشروع:
مقدمة سريعة عن Gradle - 5
على سبيل المثال، من خلال التنفيذ، gradle runسنطلق الفئة الرئيسية لتطبيق جافا الخاص بنا:
مقدمة سريعة عن Gradle - 6
كما نرى، نفس الشيء مكتوب أدناه، 2 actionable tasks: 1 executed, 1 up-to-date ماذا يعني هذا؟ هذا يعني أنه تم إكمال مهمتين: علاوة على ذلك، تم إنجاز مهمة واحدة بالفعل، ولم يتم تنفيذ واحدة، لأن... فهي محدثة، أي أن الحالة موجودة ولم يتم فعل أي شيء. يمكننا تنفيذ ما يسمى "التشغيل الجاف": gradle run -m لننفذ هذا الأمر، وسنرى ما هي المهام التي سيتم تنفيذها لتنفيذ مهمة التشغيل:
مقدمة سريعة عن Gradle - 7
كما نرى، تم إكمال 4 مهام: قبل تنفيذ التشغيل، تم تنفيذ فئات المهام التبعية. تحتوي الفئات نفسها على تبعيتين، وبالتالي فهي تنفذ أيضًا compilJava وprocessResources. عندما نقوم بمهمة ما، يمكننا تنفيذها أثناء عرض مستوى معين من السجلات (يحدد مستوى التسجيل مدى أهمية الرسائل التي نريد رؤيتها). على سبيل المثال، يمكننا أن نفعل gradle run -i. سيُظهر لنا هذا أيضًا رسائل إعلامية مثل:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
لمزيد من المعلومات حول تسجيل الدخول إلى Gradle، أنصحك بالرجوع إلى الوثائق الرسمية: " تسجيل Gradle ". كما نرى، تم تخطي مهمة الفئات لأنها UP-TO-DATE ، أي أن الحالة حالية، ولا يلزم القيام بأي شيء، لذلك لم تكن هناك أي إجراءات. وذلك لأن Gradle يحتوي بشكل افتراضي على " عمليات فحص محدثة " أو ما يسمى بالبناء المتزايد. يمكنك قراءة المزيد حول هذه الآلية في وثائق Gradle: " عمليات التحقق الحديثة (AKA Incremental Build) ". ولكن يمكن تعطيل هذه الآلية عن طريق تنفيذ مهمة تحدد علامة --rerun-tasks. على سبيل المثال، gradle run --rerun-tasks. بعد ذلك سنرى: مهمتان قابلتان للتنفيذ: مهمتان تم تنفيذهما كما ترون، فإن عدد المهام المنفذة يأخذ في الاعتبار المستوى الأول فقط من الرسم البياني، أي مهمة التشغيل نفسها وتلك المهام التي تعتمد عليها بشكل مباشر، أي ، الطبقات. لا يتم احتساب المهام التي تعتمد عليها الفئات هنا (على الرغم من تنفيذها عند تنفيذ مهمة الفئات). يجب عليك أيضًا أن تقرأ عن المهام:
مقدمة سريعة إلى Gradle - 8

التبعيات

إحدى المهام الرئيسية لأي نظام بناء هي إدارة التبعيات، أي المكتبات/الأطر التي يحتاجها مشروعنا. يجب أن يضمن نظام البناء توفرها في الوقت المناسب وتجميع القطعة الأثرية النهائية لتطبيقنا بالطريقة الصحيحة. افتراضيًا، بعد gradle init لتطبيق Java، سنرى المحتوى التالي في البرنامج النصي للإنشاء:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
هنا يتضح على الفور ما نربطه. ولكن بدون بعض الفهم، ليس من الواضح ما هو التنفيذ واختبار التنفيذ؟ نحتاج هنا إلى الرجوع مرة أخرى إلى وثائق Gradle، نظرًا لأن وثائق Gradle مكتوبة جيدًا. يطلق عليه " إدارة تكوينات التبعية ". كما هو مذكور في الوثائق، يتم الإعلان عن كل تبعية بنطاق معين - المنطقة التي ستكون هذه التبعية متاحة فيها. يتم تعيين هذا النطاق بواسطة بعض التكوينات، ولكل منها اسم فريد. ومن المثير للاهتمام أيضًا أن العديد من مكونات Gradle الإضافية تضيف تكوينات محددة مسبقًا. لمعرفة التكوينات التي يمكننا تشغيلها: gradle --console plain dependencies بهذه الطريقة سنرى قائمة بجميع التكوينات المتاحة وتبعياتها. يمكننا تصفية هذه القائمة بحيث نرى فقط التكوينات المتاحة نفسها: gradle --console plain dependencies | find " - " كيف نعرف ما يجب استخدامه؟ سيكون عليك القيام ببعض القراءة هنا. لأن نحن نستخدم المكوّن الإضافي "Java"، لذا فلنبدأ بالوثائق الخاصة به وقسم " إدارة التبعيات ". هنا نرى أنه كان هناك تكوين (ويعرف أيضًا باسم النطاق) يسمى "ترجمة" ويعني "التبعية المطلوبة أثناء الترجمة". ولكن بعد ذلك تم استبداله (باللغة الإنجليزية تم استبداله) بالتنفيذ. يمكنك قراءة المزيد حول الاستبدال في قسم " فصل واجهة برمجة التطبيقات والتنفيذ ". اتضح أن هذه التبعية ستكون على "مسار الفصل التجميعي". لكن في بعض الأحيان نريد أن يتم تضمين تبعيتنا في القطعة الأثرية النهائية. لماذا؟ على سبيل المثال، سيكون لدينا جرة قابلة للتنفيذ، والتي ينبغي أن تحتوي على كل ما هو ضروري. ماذا يجب أن نفعل إذًا؟ أولا، لا يوجد مثل هذا الدعم "خارج الصندوق" (أي افتراضيا، دون أي إجراءات إضافية). يتم تفسير ذلك من خلال حقيقة أن الجميع يريد جمع الأرشيف بطريقته الخاصة، ويحاول Gradle أن يكون في أضيق الحدود. لا يمكننا أيضًا استخدام أرشيفات الجرة في مسار الفصل (بدون معالجة إضافية في الكود)، لأن لا يعمل الأمر بهذه الطريقة (راجع " Oracle: إضافة فئات إلى Classpath لملف JAR " لمزيد من التفاصيل). ولذلك فإن أجمل طريقة هي الكود التالي في سكربت البناء:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
في إعدادات مهمة الجرة، نحدد ما سيتم إضافته إلى بيان ملف الجرة (راجع " Oracle: ضبط نقطة إدخال التطبيق "). وبعد ذلك نقول أنه سيتم تضمين جميع التبعيات اللازمة للتجميع في الجرة. البديل هو استخدام " Gradle Shadow Plugin ". قد يبدو الأمر معقدًا، لكن المكونات الإضافية الأخرى يمكن أن تجعل الحياة أسهل. على سبيل المثال، عند إنشاء تطبيق ويب (على عكس تطبيق Java العادي)، سنستخدم مكونًا إضافيًا خاصًا - " Gradle War Plugin "، والذي له سلوك مختلف وستكون حياتنا أسهل هناك (جميع التبعيات الضرورية ستكون (يتم وضعها في دليل خاص منفصل بواسطة البرنامج الإضافي نفسه. ويتم تنظيم مثل هذا العمل من خلال كيفية تنظيم تطبيقات الويب. ولكن هذه قصة مختلفة تمامًا).
مقدمة سريعة عن Gradle - 9

نتائج

يعد Gradle خيارًا ممتازًا لأنظمة بناء المشاريع. وهذا ما تؤكده حقيقة أنه يتم استخدامه من قبل مطوري المشاريع المعروفة مثل Spring و Hibernate. تمت مناقشة الأشياء الأساسية فقط أعلاه. وخلفهم يتم إخفاء ملايين الميزات والفرص التي يتمتع بها المطورون. يدعم Gradle أيضًا إنشاء مشاريع متعددة الوحدات، وهو ما لم يتم تناوله في هذه المراجعة، لكن Gradle نفسه لديه برنامج تعليمي ممتاز: " إنشاء تصميمات متعددة المشاريع ". آمل أن توضح هذه المراجعة أيضًا أن وثائق Gradle مكتوبة في 5+ ويمكنك بسهولة العثور على ما تحتاجه إذا فهمت المكان الذي تبحث فيه. وسيأتي هذا عندما تفهم الأساسيات. بالإضافة إلى ذلك، لدى Gradle برامج تعليمية رائعة. أود أن أختتم بقائمة صغيرة لما يمكنك رؤيته أيضًا باستخدام Gradle:
مقدمة سريعة عن Gradle - 10
# فياتشيسلاف
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION