تكرار السؤال: …
الإجابة المختصرة
مرحلة التهيئة (Initialization)، ثم مرحلة الإعداد (Configuration)، ثم مرحلة التنفيذ الفعلي (Execution).
الشرح
في مرحلة Initialization يحدد Gradle المشاريع الفرعية المضمنة في settings.gradle ويُنشئ كائنات Project. في مرحلة Configuration يقرأ ملفات build.gradle لكل وحدة ويبني شجرة المهام (Task Execution Graph) ويقيم سكربتات البناء وكتل إعداد المهام (خارج doFirst و doLast) للمهام التي يتم إنشاؤها فعلًا؛ مع tasks.register لا تُنشأ المهمة إلا عند الحاجة إليها. في مرحلة Execution ينفذ فقط المهام المطلوبة ومهامها التابعة وفق الترتيب المخطط.
مثال بالكود
// مثال يوضح الفرق بين الإعداد والتنفيذ:
tasks.register("myTask") {
// يُنفذ في مرحلة Configuration، لكن register كسول (lazy): لا يعمل إلا إذا احتاج Gradle
// إنشاء المهمة (عند طلبها أو كونها تابعة لمهمة مطلوبة). أما tasks.create أو الكود
// المكتوب مباشرة في build.gradle.kts فيُنفذ مع كل إعداد للمشروع (بما فيه الـ Sync).
println("Configuration phase: تهيئة المهمة")
doLast {
// ينفذ فقط في مرحلة Execution عند طلب المهمة صراحة:
println("Execution phase: جاري تنفيذ المهمة الآن")
}
}أخطاء شائعة
- كتابة كود معالجة ملفات مكلف أو استدعاءات شبكة داخل جسم المهمة مباشرة دون وضعه داخل doLast، مما يبطئ عملية مزامنة المشروع (Gradle Sync).