
چند وقتیه که کثیف بودن گریدلم خیلی رو اعصاب بوده و گریدل اکثر پروژه هام در بهترین حالت ممکن این شکلی بود:

و حالا با استفاده از Kotlin DSL میشه یکم مرتب ترش کرد:

برای اطلاعات بیشتر ارائه سنا عبادی رو در لاگ کت ببینید:
در root پروژه خودتون، پوشه buildSource رو به صورت زیر و با این ترتیب بنویسید:

بعد ساخت پوشه ابتدا پوشه سورس رو به ترتیب:
src -> main -> java
ایجاد کنید و فایل Dependencies.kt رو داخلش بسازید. بعد از این مرحله، گریدل اسکریپت خودتون رو داخل پوشه buildSrc ایجاد کنید:
build.gradle.kts:
import org.gradle.kotlin.dsl.`kotlin-dsl` plugins { `kotlin-dsl` } repositories { jcenter() }
حالا پروژه رو sync کنید و منتظر بمانید!
بعد از sync شدن پروژه، دو پوشه gradle و build به پوشه buildSrc اضافه میشه که اگه از ورژن کنترل(git) استفاده میکنید، بهتره که اونارو به gitignore اضافه کنید. به صورت دستی فایل گیت ایگنور رو اضافه کنید و به صورت زیر عمل کنید:
.gradle /build
حالا نوبت اینه که پروژه اصلیمون رو به کاتلین DSL منتقل کنیم!
settings.gradle:
include ':app' rootProject.name = "Stationery"
settings.gradle.kts:
include(":app") rootProject.name = "Stationery"
پروژه رو Sync کنید.
ابتدا فایل Dependencies رو به اینصورت بنویسید:
object Dependencies { object Versions { } object DefaultConfig { } object Plugins { } object Libraries { object Test { } } object ClassPaths { } }
آبجکت Versions برای نگه داری نسخه ها، آبجکت DefaultConfig برای نگه داری کانفیگ گریدل app، آبجکت Plugins برای نگه داری پلاگین ها، آبجکت Libraries برای نگه داری کتابخونه ها و آبجکت Test برای نگه داری کتابخونه های تست، آبجکت ClassPaths برای نگه داری ClassPath های ما ?
اول ClassPath ها و ورژنای اونارو اضافه می کنیم:
object Versions { const val gradle = "4.1.0" const val kotlin = "1.4.10" }
object ClassPaths { const val gradle = "com.android.tools.build:gradle:${Versions.gradle}" const val kotlin = "gradle-plugin" }
بیلد گردیل ماژول پروژه رو ویرایش میکنیم:
build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = "1.3.72" repositories { google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.1.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
build.gradle.kts:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() mavenCentral() maven { url = uri("https://jitpack.io") } } dependencies { classpath(Dependencies.ClassPaths.gradle) classpath(kotlin(Dependencies.ClassPaths.kotlin, version = Dependencies.Versions.kotlin)) classpath(Dependencies.ClassPaths.hilt) classpath(Dependencies.ClassPaths.safeArgs) // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() maven { url = uri("https://jitpack.io") } } } tasks.register("clean",Delete::class){ delete(rootProject.buildDir) }
حالا میرسیم به تغییر گریدل ماژول اپ، اول اطلاعاتی که لازم داریم رو داخل Dependencies که ساختیم اضافه میکنیم:
object Dependencies { object Versions { const val gradle = "4.1.0" const val kotlin = "1.4.10" const val coreKTX = "1.3.1" const val appCompat = "1.2.0" const val constraintLayout = "2.0.1" const val legacySupport = "1.0.0" const val espresso = "3.3.0" const val jUnit = "4.13" const val arch = "2.1.0" const val concurrent = "1.1.0" const val lifeCycle = "2.2.0" const val hilt = "2.28-alpha" const val hiltAndroid = "1.0.0-alpha02" const val leakCanary = "2.4" } const val compileSdkVersion = 30 const val buildToolsVersion = "30.0.2" object DefaultConfig { const val applicationID = "ir.moeindeveloper.stationery" const val minSdKVersion = 19 const val targetSdkVersion = 30 const val versionCode = 1 const val versionName = "1.0" const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } object Plugins { const val application = "com.android.application" const val android = "android" const val kotlinExtensions = "android.extensions" const val kapt = "kapt" const val hilt = "dagger.hilt.android.plugin" const val safeArgs = "androidx.navigation.safeargs.kotlin" } object Libraries { const val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}" const val coreKTX = "androidx.core:core-ktx:${Versions.coreKTX}" const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompat}" const val constraintLayout = "androidx.constraintlayout:constraintlayout:${Versions.constraintLayout}" const val legacySupport = "androidx.legacy:legacy-support-v4:${Versions.legacySupport}" const val concurrent = "androidx.concurrent:concurrent-futures-ktx:${Versions.concurrent}" const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-ktx:${Versions.lifeCycle}" const val liveData = "androidx.lifecycle:lifecycle-livedata-ktx:${Versions.lifeCycle}" const val lifeCycleCommon = "androidx.lifecycle:lifecycle-common-java8:${Versions.lifeCycle}" const val activity = "androidx.activity:activity-ktx:${Versions.activity}" const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}" const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}" const val hiltAndroid = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltAndroid}" const val leakCanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakCanary}" object Test { const val espressoContrib = "androidx.test.espresso:espresso-contrib:${Versions.espresso}" const val espressoIntents = "androidx.test.espresso:espresso-intents:${Versions.espresso}" const val espressoAccessibility = "androidx.test.espresso:espresso-accessibility:${Versions.espresso}" const val espressoWeb = "androidx.test.espresso:espresso-web:${Versions.espresso}" const val espressoIdlingConcurrent = "androidx.test.espresso.idling:idling-concurrent:${Versions.espresso}" const val jUnit = "junit:junit:${Versions.jUnit}" } } object ClassPaths { const val gradle = "com.android.tools.build:gradle:${Versions.gradle}" const val kotlin = "gradle-plugin" const val hilt = "com.google.dagger:hilt-android-gradle-plugin:${Versions.hilt}" const val safeArgs = "androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.navigation}" } }
خب حالا فایل گریدل ماژول اپ رو به کاتلین DSL تغییر میدیم:
build.gradle:
plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdkVersion 30 buildToolsVersion "30.0.2" defaultConfig { applicationId "ir.moeindeveloper.stationery" minSdkVersion 19 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
قسمت پلاگین:
plugins { id(Dependencies.Plugins.application) kotlin(Dependencies.Plugins.android) kotlin(Dependencies.Plugins.kotlinExtensions) kotlin(Dependencies.Plugins.kapt) id(Dependencies.Plugins.hilt) id(Dependencies.Plugins.safeArgs) }
برای پلاگین هایی که برا کاتلین هستن از kotlin استفاده می کنیم مثل kotlin-android و دیگه نیازی نیست که کاتلین رو اول عبارت بنویسیم و اینطوری کافیه:
const val android = "android"
قسمت اندروید:
android { compileSdkVersion(Dependencies.compileSdkVersion) buildToolsVersion(Dependencies.buildToolsVersion) defaultConfig { applicationId = Dependencies.DefaultConfig.applicationID minSdkVersion(Dependencies.DefaultConfig.minSdKVersion) targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion) versionCode = Dependencies.DefaultConfig.versionCode versionName = Dependencies.DefaultConfig.versionName multiDexEnabled = true testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner } buildTypes { getByName("release") { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } buildFeatures { viewBinding = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } }
قسمت وابستگی ها:
dependencies { implementation(Dependencies.Libraries.kotlin) implementation(Dependencies.Libraries.coreKTX) implementation(Dependencies.Libraries.appCompat) implementation(Dependencies.Libraries.constraintLayout) implementation(Dependencies.Libraries.legacySupport) /* arch components */ implementation(Dependencies.Libraries.concurrent) implementation(Dependencies.Libraries.viewModel) implementation(Dependencies.Libraries.liveData) implementation(Dependencies.Libraries.lifeCycleCommon) implementation(Dependencies.Libraries.activity) /* arch components */ /* Hilt */ implementation(Dependencies.Libraries.hilt) kapt(Dependencies.Libraries.hiltCompiler) implementation(Dependencies.Libraries.hiltAndroid) /* Hilt */ debugImplementation(Dependencies.Libraries.leakCanary) /* Test libs */ androidTestImplementation(Dependencies.Libraries.Test.espressoCore) androidTestImplementation(Dependencies.Libraries.Test.espressoContrib) androidTestImplementation(Dependencies.Libraries.Test.espressoIntents) androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility) androidTestImplementation(Dependencies.Libraries.Test.espressoWeb) androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent) testImplementation(Dependencies.Libraries.Test.jUnit) /* Test libs */ }
build.gradle.kts:
plugins { id(Dependencies.Plugins.application) kotlin(Dependencies.Plugins.android) kotlin(Dependencies.Plugins.kotlinExtensions) kotlin(Dependencies.Plugins.kapt) id(Dependencies.Plugins.hilt) id(Dependencies.Plugins.safeArgs) } android { compileSdkVersion(Dependencies.compileSdkVersion) buildToolsVersion(Dependencies.buildToolsVersion) defaultConfig { applicationId = Dependencies.DefaultConfig.applicationID minSdkVersion(Dependencies.DefaultConfig.minSdKVersion) targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion) versionCode = Dependencies.DefaultConfig.versionCode versionName = Dependencies.DefaultConfig.versionName multiDexEnabled = true testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner } buildTypes { getByName("release") { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } buildFeatures { viewBinding = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } } dependencies { implementation(Dependencies.Libraries.kotlin) implementation(Dependencies.Libraries.coreKTX) implementation(Dependencies.Libraries.appCompat) implementation(Dependencies.Libraries.constraintLayout) implementation(Dependencies.Libraries.legacySupport) /* arch components */ implementation(Dependencies.Libraries.concurrent) implementation(Dependencies.Libraries.viewModel) implementation(Dependencies.Libraries.liveData) implementation(Dependencies.Libraries.lifeCycleCommon) implementation(Dependencies.Libraries.activity) /* arch components */ /* Hilt */ implementation(Dependencies.Libraries.hilt) kapt(Dependencies.Libraries.hiltCompiler) implementation(Dependencies.Libraries.hiltAndroid) /* Hilt */ debugImplementation(Dependencies.Libraries.leakCanary) /* Test libs */ androidTestImplementation(Dependencies.Libraries.Test.espressoCore) androidTestImplementation(Dependencies.Libraries.Test.espressoContrib) androidTestImplementation(Dependencies.Libraries.Test.espressoIntents) androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility) androidTestImplementation(Dependencies.Libraries.Test.espressoWeb) androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent) testImplementation(Dependencies.Libraries.Test.jUnit) /* Test libs */ }
گریدل رو سینک کنید! کار شما تموم شد و گردیل شما مرتبه و هندل کردن اطلاعات آسون تر شده و به راحتی میتونید نسخه هارو تغییر بدید!
نکته مهم: چینش کانفیگ شما به این صورت کاری زمان بر و وقت گیره! برای راحتی کار از این پلاگین استفاده کنید:
اگه پیشنهادی، انتقادی یا سوالی داشتید در کامنت ها واسم بنویسید!