ماژولار سازی Gradle با Kotlin-DSL

فرض کنید در یک پروژه چندین ماژول داشته باشیم و dependency های مشترکی هم داشته باشن ، اگر بخوایم این dependency ها رو آپدیت ، دانگرید یا هر گونه تغییری بدیم باید تک تک بریم و فایل gradle اون ها رو عوض کنیم یا حتی اگر یک ماژول داشته باشیم شاید علاقه داشته باشیم کمی فایل gradle و تنظیمات اون رو مرتب کنیم ، برای این مساله ما نیاز داریم نوعی اسکریپت رو برای gradle مون ایجاد کنیم .زبان های DSLقبل از هر چیز باید بدونیم که می‌تونیم زبان های برنامه نویسی رو به دو دسته DSL و GPL تقسیم کنیم ، DSL مخفف Domain-specific language هست ، یعنی زبان هایی که مختص یک حوزه به خصوص هستند و GPL به معنی General purpose languages یعنی زبان هایی که برای اهداف مختفی طراحی شدند ، اگر بخواهیم از DSL مثال بزنیم میشه به SQL اشاره کرد ، شما با SQL می تونید اپ اندروید بنویسید ؟ یا یک سایت بالا بیارید ؟ نه ! فقط برای کار با دیتابیس طراحی شده اما زبانی مثل Java رو هزار تا کار می‌تونید باهاش بکنید ، می‌تونید اپ جاوا بنویسید ، می‌تونید Backend بنویسید ، می‌تونید در سخت افزار ازش استفاده کنید و ... .حالا زبان Kotlin چیه ؟ مسلما باید GPL باشه و هست اما یک زبان زیرمجموعه هم تحت عنوان Kotlin-DSL داره ، این زبان گرامر متفاوتی نداره و از همون گرامر Kotlin پیروری می‌کنه ، ما در فایل gradle مون از زبانی به اسم Groovy-DSL استفاده می‌کنیم (برای اطلاع بیشتر در مورد Groovy این لینک رو مطالعه کنید) ، حالا ما می‌تونیم برای فایل gradle مون از Kotlin-DSL استفاده کنیم .شروع کاربرای start قضیه طبق عکس زیر این پوشه رو در root پروژه تون ایجاد کنید :ایجاد فایل buildSrcحالا ما به یک gradle جایگزین نیاز داریم ، برای این منظور در پوشه ای که الان ساختیم فایلی به اسم build.gradle.kts رو ایجاد می‌کنیم (فرمت فایل kts خواهد بود) ، حالا باید Kotlin-DSL رو برای پروژه فعال کنیم ، برای این کار کد زیر رو در فایلی که الان ساختید کپی کنید و بعدش پروژه رو synch کنید : https://gist.github.com/sasssass/dedefdc6024df4c6d8bc24ead9d1c4ca خب حالا پلاگین Kotlin-DSL فعال شده ، اگر روی پوشه buildSrc بیایید و یک Directory جدید بسازید به شما پیشنهاداتی میده ، طبق عکس زیر گزینه ای که هایلایت شده رو انتخاب کنید تا این پوشه ساخته بشه :ایجاد پوشه srcخب ، کاری که ما می‌خوایم انجام بدیم اینه که فایل gradle ماژول App و همین طور فایل gradle کل پروژه بیانیه سری اطلاعات رو از اینجا بخونن ، این اطلاعات چیزایی مثل minSdkVersion ، versionName و dependency های ما هستن .در ابتدا در این پوشه ای که الان ساختیم یک فایل به نام Application ایجاد می‌کنیم ، تو این فایل قراره اطلاعات خودِ نسخه (همون versionName و اینا) رو تنظیم کنیم . https://gist.github.com/sasssass/78b676e78fd29ea7bfa3bfcb34007d8f حالا می‌خوایم dependency ها و version هاشون رو مشخص کنیم ، پس دو کلاس به هم اسامی می‌سازیم : https://gist.github.com/sasssass/0d5e5632061d5f85a033a448e1f5cee5 و https://gist.github.com/sasssass/1d9e950f0c9efbb512ae3420a65cd3f5 من برای gradle کلی دیگه این کار رو انجام نمی‌دم چون مشابهه ، حالا باید در فایل gradle ماژول App بیاییم و این ها رو به هم وصل کنیم پس gradle به این صورت در میاد : https://gist.github.com/sasssass/48cf88c47f1e17ed7c429be462ddafc3 خب حالا مزیت های این کارایی که کردیم چیه ؟ برای اینکه بهتر بفهمید چقدر کدهامون قدرتمند تر میشه یک تغییری در کدهای بالا می‌دیم ، می‌خوایم به جای اینکه دونه دونه dependency ها رو اضافه کنیم کلشو با یه خط اضافه کنیم ، برای این کار اول در کلاس Dependency یک تابع ایجاد می‌‎کنیم : https://gist.github.com/sasssass/edeee79872a84b35d672941dc250522c حالا این تیکه از فایل gradle رو به این صورت تغییر می‌دیم : https://gist.github.com/sasssass/4303322ef83ee7adfa84769ed0874841 و این طوری کل dependency هامون یکجا add شدند ! مزیت بزرگی که Kotlin-DSL به ما می‌ده استفاده از syntax خودِ Kotlin برای Gradle هست ، مثلا در مثال بالا ما از یک تابع واسطه استفاده کردیم (که بی مورد بود صرفا مثلا آموزشی بود) .برای مطالعه بیشتر این مقاله رو پیشنهاد می‌کنم .من رو در لینکدین ، اینستاگرام و یوتیوب دنبال کنید ???اگه دوست داشتید می‌تونید به صفحه Spotify و SoundCloud بنده هم برید و موسیقی های منو گوش بدید ???