What's Gradle? هو عبارة عن build tool يعنى ايه؟ على المستوى الصغير لما هتيجى تكتب برنامج هتكون المسئول عنه كله كل الكود بتاعك فمش هتحتاج غير إنك تعمل compile أو run للكود والدنيا ماشية. بس تعمل إيه لو بقيت محتاج لكود كتبه ناس غيرك؟ دا بنسميه dependency

محتاج تنزل ال dependencies اللى هتبنى عليها، وتنزل ال version اللى أنت هتشتغل بيها، وساعات ال dependency بتكون معتمدة على غيرها ودول بيكون اسمهم transitive dependencies فمحتاج تنزلهم. فكل دا على بعضه اسمه dependency management.
غير كدا لو مش محتاج dependencies فأنت هتكتب tests للكود بتاعك، ومحتاج تطلع report من ال tests دى وحجات كتيرة ملهاش علاقة بال compile و ال run العادى بتاعك.
وأخيراً بتحتاج لما تخلص كل دا تعمل publish للشغل بتاعك وتقول للناس يستخدموه إزاى وممكن يستخدموه. كل العمليات دى بتتكرر بشكل يومى بالنسبة لك ك developer وأحسن حاجة إحنا شاطرين فيها إننا نقضى على التكرار. فعملنا ال build tools
ال build tools ببساطة إننا بنعمل automation لكل العمليات اللى فوق دى. ننزل ال dependencies ونتابع النسخ بتاعتها نعمل run ل tests ونطلع منها reports نعمل compile للكود بتاعنا ونطلع منه executable أو library على حسب نعمل publish للكلام دا بحيث يبقى متاح للناس تستعمله
و gradle واحد من أشهر ال build tools اللى موجودة وشهرته كبيرة كدا بالنسبة لينا كا android developers ال gradle بيكون له المسئووليات اللى ذكرناها فوق - dependency management - build configuration - tasks خلينا نمسك حاجة حاجة ونبص لهيكل الشغل بتاع gradle

بشكل أساسى gradle بيتكون من - root-project - 1 or more sub-project وبالنسبة ل files اللى بتوصف ال settings و ال build يحصل ازاى بيكونوا - settings.gradle (root-project) - build.gradle ودول بيتكتبوا يا إما ب groovy DSL يا kotlin DSL وحاليا المفضل هو Kotlin DSL
ال DSL إختصار ل Domain Specific Language ودى بتبقى مجموعة functions و ال variables مسؤولة عن حاجة واحدة وفى حالتنا هنا مسؤولة عن إزاى نعمل build
أول حاجة هنبصلها هتكون ال settings.gradle بيكون فيه اسم ال root-project واسم ال sub-projects ولازم اسمه يبقى على اسم ال folder اللى محطوط فيه ودا ل project عادى مش android لأجل البساطة ولإن المفاهيم واحدة.

بعد كدا هنبص على ال build.gradle اللى هنلقيه جوا app هنا هنلاقى تلت حاجات - plugins - repositories - dependencies وظيفة ال plugins إنها تضيف للحاجات اللى gradle قادر يعملها أنواعها - core: downloaded with gradle - community: الناس بتعملها وبتنشرها - local: إنت اللى عاملها

بعدين عندنا ال repositories اللى هى بكل بساطة مكان الناس بترفع عليه شغلها ك libraries بحيث نقدر ننزلها ونستخدمها ك dependency. فهنا بنختار mavenCentral كمكان نجيب منه ال dependencies بتاعتنا وهنا برضو اختارنا dependencies زى junit لل testing و guava ل java 8

وقبل ما نخش فى بحر ال dependency management بيجى سؤال مهم طب هو مش gradle دا برنامج وله versions إزاى نوحد النتيجة بتاعته بينا وممكن يبقى عندنا versions مختلفة؟ هنا بيجى دور ال gradle wrapper هتلاقى في gradle/wrapper باسم https://t.co/HuJk1a2Mkj

وظيفة ال wrapper إنه يحدد ال version بتاعت gradle اللى كلنا هنستخدمها واحنا شغالين على المشروع بحيث لو حصلت مشكلة فى ال build تكون عامة وسهل تكررها وميكونش لها علاقة بإختلاف ال versions وبنستخدمها عن طريق ./gradlew (macOs - linux) ./gradlew.bat (windows العاق)
نرجع لل dependency management ونبص لل dependencies هنلاقى الآتى - configuration: بيحدد ال dependency تبع إيه - Module ID بيحدد ال dependency وبيتكون من جزئين ال library واسم ال group اللى بتنتمى له ال library دى - Module Version نسخة ال library دى

أغلبهم واضحين إنما إيه ال implementation دى؟ بكل بساطة مش كل ال dependencies بنحتاجها واحنا بنعمل compile أو واحنا بنعمل test أو فى ال runtime فمن هنا تم الفصل بين ال dependencies بناء على وقت احتياجنا لهم عشان نسرع ال build

فمثلاً هنا تلاقى api و implementation دول تمييز دقيق جداً دلوقتى بنستخدم dependency معينة ودى بدورها ممكن تكون بتستخدم واحدة تانية transitive دلوقتى ال classes اللى موجودة فى ال transitive مش لازم أعرف عنها حاجة إلا إذا هستخدمها فى الكود بتاعى
ومن هنا جيه الفرق بينهم ال implementation معناها إنى مش هستخدم ال classes اللى موجودة فى ال transitive dependency ال api معناها إننا هنستخدمهم فلازم يكونوا موجودين
عشان نظبط موضوع ال dependency بقينا بنستعمل من أول gradle 8.5 حاجة اسمها version catalog


ظبطنا كدا كل حاجة، باقى ن build أو ن tests أو أى حاجة عايزين نعملها، وأى حاجة بنكون عايزين نعملها بيكون اسمها task عايز تعرف ايه ال tasks اللى موجودة ./gradlew tasks اه والله بسيطة :" تركيب ال tasks بسيط - Input - Action(s) - Output وال output ممكن يكون Input لtask تانية

من مزايا ال build tool إنها ممكن تاخد بالها من حالة ال task وهل ال output مش بيتغير لو ال input متغيرش بيكونوا deterministic وبكدا ممكن يوفر إنه ينفذ ال task تانى لو ال input فضل زى ما هو بيستخدم ال output القديم
بس كدا دا ملخص سريع وشامل للتعامل مع gradle مش حاسس إنك فهمت؟ حصل خير ممكن تاخد ال course دا من DPE University مجانى ومفيد جداً https://t.co/CC6O8a9Dn7