بدر ربنا يرزقه
بدر ربنا يرزقه

@TsukiHyouka

21 تغريدة 1 قراءة Feb 07, 2025
What's Gradle?
هو عبارة عن build tool يعنى ايه؟
على المستوى الصغير لما هتيجى تكتب برنامج هتكون المسئول عنه كله كل الكود بتاعك فمش هتحتاج غير إنك تعمل compile أو run للكود والدنيا ماشية.
بس تعمل إيه لو بقيت محتاج لكود كتبه ناس غيرك؟
دا بنسميه dependency x.com
محتاج تنزل ال 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 x.com
بشكل أساسى 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 لأجل البساطة ولإن المفاهيم واحدة. x.com
بعد كدا هنبص على ال build.gradle اللى هنلقيه جوا app
هنا هنلاقى تلت حاجات
- plugins
- repositories
- dependencies
وظيفة ال plugins إنها تضيف للحاجات اللى gradle قادر يعملها أنواعها
- core: downloaded with gradle
- community: الناس بتعملها وبتنشرها
- local: إنت اللى عاملها x.com
بعدين عندنا ال repositories اللى هى بكل بساطة مكان الناس بترفع عليه شغلها ك libraries بحيث نقدر ننزلها ونستخدمها ك dependency.
فهنا بنختار mavenCentral كمكان نجيب منه ال dependencies بتاعتنا
وهنا برضو اختارنا dependencies زى junit لل testing و guava ل java 8 x.com
وقبل ما نخش فى بحر ال dependency management بيجى سؤال مهم طب هو مش gradle دا برنامج وله versions إزاى نوحد النتيجة بتاعته بينا وممكن يبقى عندنا versions مختلفة؟
هنا بيجى دور ال gradle wrapper هتلاقى في gradle/wrapper باسم gradle-wrapper.properties x.com
وظيفة ال 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 دى x.com
أغلبهم واضحين إنما إيه ال implementation دى؟
بكل بساطة مش كل ال dependencies بنحتاجها واحنا بنعمل compile أو واحنا بنعمل test أو فى ال runtime
فمن هنا تم الفصل بين ال dependencies بناء على وقت احتياجنا لهم عشان نسرع ال build x.com
فمثلاً هنا تلاقى api و implementation دول تمييز دقيق جداً
دلوقتى بنستخدم dependency معينة ودى بدورها ممكن تكون بتستخدم واحدة تانية transitive دلوقتى ال classes اللى موجودة فى ال transitive مش لازم أعرف عنها حاجة إلا إذا هستخدمها فى الكود بتاعى
ومن هنا جيه الفرق بينهم
ال implementation معناها إنى مش هستخدم ال classes اللى موجودة فى ال transitive dependency
ال api معناها إننا هنستخدمهم فلازم يكونوا موجودين
عشان نظبط موضوع ال dependency بقينا بنستعمل من أول gradle 8.5 حاجة اسمها version catalog x.com
ظبطنا كدا كل حاجة، باقى ن build أو ن tests أو أى حاجة عايزين نعملها، وأى حاجة بنكون عايزين نعملها بيكون اسمها task عايز تعرف ايه ال tasks اللى موجودة
./gradlew tasks
اه والله بسيطة :"
تركيب ال tasks بسيط
- Input
- Action(s)
- Output
وال output ممكن يكون Input لtask تانية x.com
من مزايا ال build tool إنها ممكن تاخد بالها من حالة ال task وهل ال output مش بيتغير لو ال input متغيرش بيكونوا deterministic وبكدا ممكن يوفر إنه ينفذ ال task تانى لو ال input فضل زى ما هو بيستخدم ال output القديم
بس كدا دا ملخص سريع وشامل للتعامل مع gradle مش حاسس إنك فهمت؟
حصل خير ممكن تاخد ال course دا من DPE University مجانى ومفيد جداً
dpeuniversity.gradle.com

جاري تحميل الاقتراحات...