Миграция Gradle Groovy в Kotlin DSL Модуляризация

Я пытаюсь перенести свой проект Gradle с Groovy на Kotlin DSL.

Надеюсь, кто-нибудь сможет мне помочь.

Итак, мой проект использовал модуляризацию, и вот как выглядит моя структура проекта

Да, это сложно. Это code, унаследованный от моего старшего (он уволился). я попытался разбить по одному.

есть 3 типа модулей:

для достижения чистого codeа в gradle каждое ядро, функция и подфункция он создает общий gradle, который:

вот шаг, который я сделал для миграции перед использованием контроля версий я использовал файл версий.gradle, как это.

я создал контроль версий (libs.versions.toml)

libs.versions.toml

это всего лишь несколько зависимостей, которые я использовал.

далее мне удалось перенести мой проект уровня build.gradle и приложение

вот code с некоторым датчиком.

проект уровня build.gradle

а это приложение уровня build.gradle

приложение уровня build.gradle

и вот проблема. Я не могу рефакторить все общие gradle, даже если я пытался изменить модуль, который застрял.

Я покажу вам файл общего gradle, прежде чем рефакторить его.

share_build.gradle

share_build_core.gradle

и немного gradle из основного модуля

И вот в чем проблема.

Извините за длинное объяснение от меня. Спасибо.

root
├── shared_build.gradle
├── shared_build_core.gradle
├── shared_build_feature.gradle
├── shared_build_sub_feature.gradle
├── build.gradle
│  
├── app
│   ├── build.gradle.kts
│  
├── core
│   │
│   ├── core-data
│   │   ├── build.gradle
│   │
│   ├── core-navigation
│   │   ├── build.gradle
│   │
│   ├── core-resource
│   │   ├── build.gradle
│   │
│   ├── core-analytics
│   │   ├── build.gradle
│   │
│   └── core-util
│       ├── build.gradle
│  
│  
├── features
│   ├── feature-auth
│   │   ├── build.gradle
│   │
│   ├── feature-home
│   │   ├── build.gradle
│   └── ...
│   
└── settings.gradle
ext.versions = [
        //region Release

        code                       : 68,
        name                       : "2.15.0",

        //release version 60
        schemaDatabaseVersion      : 62,
        schemaDatabaseBeforeVersion: 61,


        //endregion
        //region SDK

        compileSdkVersion          : 33,
        minSdkVersion              : 27,
        targetSdkVersion           : 33,

        //endregion
        //region Plugin

        agp                        : '8.5.0',
        crashlytics                : '2.5.2',
        google_services            : '4.3.14',
        kotlin                     : '1.8.0',
        navigation_safe_args       : '2.5.0',
        firebase_perf_plugin       : '1.4.1',
]

ext.plugin = [
        agp                 : "com.android.tools.build:gradle:$versions.agp",
        crashlytics         : "com.google.firebase:firebase-crashlytics-gradle:$versions.crashlytics",
        google_services     : "com.google.gms:google-services:$versions.google_services",
        kotlin              : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin",
        navigation_safe_args: "androidx.navigation:navigation-safe-args-gradle-plugin:$versions.navigation_safe_args",
        firebase_perf       : "com.google.firebase:perf-plugin:$versions.firebase_perf_plugin",
        oneSignal           : "gradle.plugin.com.onesignal:onesignal-gradle-plugin:$versions.oneSignal"
]

ext.deps = [
        //region Common

        stdlib              : "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin",
        coroutines          : [
                "org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutine",
                "org.jetbrains.kotlinx:kotlinx-coroutines-android:$versions.coroutine"
        ],
        material            : "com.google.android.material:material:$versions.material",
        koin                : [
                "io.insert-koin:koin-android:$versions.koin",
                "io.insert-koin:koin-android-compat:$versions.koin",
                "io.insert-koin:koin-androidx-workmanager:$versions.koin",
                "io.insert-koin:koin-androidx-navigation:$versions.koin"
        ],
        jdk_lib             : "com.android.tools:desugar_jdk_libs:$versions.jdk_lib",
        kotlin_reflect      : "org.jetbrains.kotlin:kotlin-reflect:$versions.kotlin_reflect",
]
[versions]

#plugins
agp = "8.5.0"
kotlin = "1.8.0"

#dependencies
dexguard = "9.8.0"
kotlinGradle = "1.8.0"
navigationSafeArgs = "2.5.3"
googleServices = "4.3.15"
firebasePlugin = "2.9.5"
firebasePerfPlugin = "1.4.1"

#Koin
koin = "3.2.2"

# JetPack
lifecycle = "2.6.0-alpha04"
appCompat = "1.7.0-alpha01"
core = "1.10.0-alpha01"

# Firebase
firebaseBom = "31.4.0"
firebaseConfig = "21.1.2"

# Extras
debugBanner = "1.0.4"
leakCanary = "2.10"
logger = "2.2.0"
localeHelper = "1.1.4"
dateTimeUtils = "v0.2.1"
lottie = "5.2.0"

# Encryption and Security
sqlcipher = "4.5.3"

# Material
material = "1.8.0-rc01"

#Common Dependencies
stdLib = "1.3.41"
kotlinReflect = "1.4.0"
jdkLib = "1.0.9"

#Testing
junit = "4.13-beta-3"
truth = "1.0-rc2"
robolectric = "4.9.2"
hamcrest = "2.1"
test_core = "1.4.0-alpha05"
test_runner = "1.4.0-alpha05"
test_rules = "1.4.0-alpha05"
test_espresso = "3.3.0-alpha01"
test_ext_junit_ktx = "1.1.3-alpha05"
test_ext_truth = "1.3.0-alpha01"
test_fragment = "1.2.0-alpha01"
mockk = "1.13.3"
test_livedata = "2.1.0"

#Security
securityCrypto = "1.1.0-alpha02"
securePreferences = "0.1.7"

#Gson
gson = "2.10.1"

[libraries]

#common dependencies
kotlinStdLib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "stdLib" }
kotlinReflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlinReflect" }
jdkLib = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "jdkLib" }


#dependencies
gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" }
dexguard = { group = "com.guardsquare", name = "dexguard-gradle-plugin", version.ref = "dexguard" }
kotlinGradle = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlinGradle" }
navigationSafeArgs = { group = "androidx.navigation", name = "navigation-safe-args-gradle-plugin", version.ref = "navigationSafeArgs" }
googleServices = { group = "com.google.gms", name = "google-services", version.ref = "googleServices" }
firebasePlugin = { group = "com.google.firebase", name = "firebase-crashlytics-gradle", version.ref = "firebasePlugin" }
firebasePrerfPlugin = { group = "com.google.firebase", name = "perf-plugin", version.ref = "firebasePerfPlugin" }


# koin
koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" }
koin-android-compat = { group = "io.insert-koin", name = "koin-android-compat", version.ref = "koin" }
koin-androidx-workmanager = { group = "io.insert-koin", name = "koin-androidx-workmanager", version.ref = "koin" }
koin-androidx-navigation = { group = "io.insert-koin", name = "koin-androidx-navigation", version.ref = "koin" }

# JetPack
lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" }
lifecycle-viewmodel-savedstate = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-savedstate", version.ref = "lifecycle" }
lifecycle-common-java8 = { group = "androidx.lifecycle", name = "lifecycle-common-java8", version.ref = "lifecycle" }
lifecycle-service = { group = "androidx.lifecycle", name = "lifecycle-service", version.ref = "lifecycle" }
lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycle" }

appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appCompat" }
appcompat-resources = { group = "androidx.appcompat", name = "appcompat-resources", version.ref = "appCompat" }

core = { group = "androidx.core", name = "core-ktx", version = "core" }

# Firebase
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" }
firebase-analytics-ktx = { group = "com.google.firebase", name = "firebase-analytics-ktx" }
firebase-crashlytics-ktx = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" }
firebase-perf = { group = "com.google.firebase", name = "firebase-perf" }
firebase-config-ktx = { group = "com.google.firebase", name = "firebase-config-ktx", version.ref = "firebaseConfig" }
firebase-messaging-ktx = { group = "com.google.firebase", name = "firebase-messaging-ktx" }

# Extras
debugBanner = { group = "com.github.armcha", name = "DebugBanner", version.ref = "debugBanner" }
leakCanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakCanary" }
logger = { group = "com.orhanobut", name = "logger", version.ref = "logger" }
localeHelper = { group = "com.zeugmasolutions.localehelper", name = "locale-helper-android", version.ref = "localeHelper" }
dateTimeUtils = { group = "com.github.fadhyyusuf", name = "BithealthDateTimeUtils", version.ref = "dateTimeUtils" }
lottie = { group = "com.airbnb.android", name = "lottie", version.ref = "lottie" }


# Encryption and Security
sqlcipher = { group = "net.zetetic", name = "android-database-sqlcipher", version.ref = "sqlcipher" }

# Material
material = { group = "com.google.android.material", name = "material", version.ref = "material" }

#Testing
junit = { group = "junit", name = "junit", version.ref = "junit" }
truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" }
hamcrest = { group = "org.hamcrest", name = "hamcrest", version.ref = "hamcrest" }
test_core = { group = "androidx.test", name = "core-ktx", version.ref = "test_core" }
test_runner = { group = "androidx.test", name = "runner", version.ref = "test_runner" }
test_rules = { group = "androidx.test", name = "rules", version.ref = "test_rules" }
test_espresso_contrib = { group = "androidx.test.espresso", name = "espresso-contrib", version.ref = "test_espresso" }
test_espresso_intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "test_espresso" }
test_espresso_accessibility = { group = "androidx.test.espresso", name = "espresso-accessibility", version.ref = "test_espresso" }
test_espresso_remote = { group = "androidx.test.espresso", name = "espresso-remote", version.ref = "test_espresso" }
test_espresso_idling_concurrent = { group = "androidx.test.espresso.idling", name = "idling-concurrent", version.ref = "test_espresso" }
test_espresso_idling_net = { group = "androidx.test.espresso.idling", name = "idling-net", version.ref = "test_espresso" }
test_ext_junit_ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "test_ext_junit_ktx" }
test_ext_truth = { group = "androidx.test.ext", name = "truth", version.ref = "test_ext_truth" }
test_fragment = { group = "androidx.fragment", name = "fragment-testing", version.ref = "test_fragment" }
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
test_livedata = { group = "androidx.arch.core", name = "core-testing", version.ref = "test_livedata" }

#Security
securityCrypto = { group = "androidx.security", name = "security-crypto", version.ref = "securityCrypto" }
securePreferences = { group = "com.scottyab", name = "secure-preferences-lib", version.ref = "securePreferences" }

#Gson
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
googleGms = { id = "com.google.gms.google-services", version.ref = "googleServices" }
firebaseCrashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebasePlugin" }
firebasePerf = { id = "com.google.firebase.firebase-perf", version.ref = "firebasePerfPlugin" }

benManesVersions = { id = "com.github.ben-manes.versions", version = "0.42.0" }
detekt = { id = "io.gitlab.arturbosch.detekt", version = "1.23.3" }
sonarqube = { id = "org.sonarqube", version = "4.2.1.3168" }
kotlinAndroid = { id = "org.jetbrains.kotlin.android", version = "1.8.0" }
buildscript {
    dependencies {
        classpath(libs.dexguard)
        classpath(libs.kotlinGradle)
        classpath(libs.gradlePlugin)
        classpath(libs.navigationSafeArgs)
        classpath(libs.googleServices)
        classpath(libs.firebasePlugin)
        classpath(libs.firebasePrerfPlugin)
    }
}


plugins {
    alias(libs.plugins.benManesVersions)
    alias(libs.plugins.detekt)
    alias(libs.plugins.sonarqube)
    alias(libs.plugins.kotlinAndroid) apply false
}


subprojects {
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
        kotlinOptions {
            jvmTarget = "1.8"
            allWarningsAsErrors = false
        }
    }
}

sonar {
    properties {
        property("sonar.projectKey", "xxxxxxxxxx")
        property("sonar.projectName", "xxxxxxxxx")
    }
}

detekt {
    allRules = false
    config.setFrom("$projectDir/detekt.yml")
    reports {
        xml.required.set(true)
        txt.required.set(true)
    }
}

tasks.withType<io.gitlab.arturbosch.detekt.Detekt> {
    jvmTarget = "1.8"
}
import java.util.Properties
import java.io.FileInputStream

plugins {
    id("com.android.application")
    id("com.google.gms.google-services")
    id("com.google.firebase.crashlytics")
    id("com.google.firebase.firebase-perf")
    id("dexguard")
}


apply(from = "../shared_build.gradle")

val keystorePropertiesFile = rootProject.file("keys/keystore.properties")
val keystoreProperties = Properties().apply {
    load(FileInputStream(keystorePropertiesFile))
}

android {
    defaultConfig {
        applicationId = "com.example.xxx"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments(
                    mapOf(
                        "room.schemaLocation" to "$projectDir/schemas",
                        "room.incremental" to "true",
                        "room.expandProjection" to "true"
                    )
                )
            }
        }
    }
    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["releaseKeyAlias"] as String
            keyPassword = keystoreProperties["releaseKeyPassword"] as String
            storeFile = file(keystoreProperties["releaseStoreFile"] as String)
            storePassword = keystoreProperties["releaseStorePassword"] as String
        }
        create("preProd") {
            keyAlias = keystoreProperties["preprodKeyAlias"] as String
            keyPassword = keystoreProperties["preprodKeyPassword"] as String
            storeFile = file(keystoreProperties["preprodStoreFile"] as String)
            storePassword = keystoreProperties["preprodStorePassword"] as String
        }
        create("stagingProd") {
            keyAlias = keystoreProperties["stagingProdKeyAlias"] as String
            keyPassword = keystoreProperties["stagingProdKeyPassword"] as String
            storeFile = file(keystoreProperties["stagingProdStoreFile"] as String)
            storePassword = keystoreProperties["stagingProdStorePassword"] as String
        }
        create("staging") {
            keyAlias = keystoreProperties["stagingKeyAlias"] as String
            keyPassword = keystoreProperties["stagingKeyPassword"] as String
            storeFile = file(keystoreProperties["stagingStoreFile"] as String)
            storePassword = keystoreProperties["stagingStorePassword"] as String
        }
        getByName("debug") {
            keyAlias = keystoreProperties["debugKeyAlias"] as String
            keyPassword = keystoreProperties["debugKeyPassword"] as String
            storeFile = file(keystoreProperties["debugStoreFile"] as String)
            storePassword = keystoreProperties["debugStorePassword"] as String
        }
    }
    buildTypes {
        getByName("release") {
            isCrunchPngs = false
            isShrinkResources = false
            isMinifyEnabled = false
            isDebuggable = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("release")
        }
        create("preProd") {
            isCrunchPngs = false
            isShrinkResources = false
            isMinifyEnabled = false
            isDebuggable = true
            applicationIdSuffix = ".preProd"
            versionNameSuffix = "-preProd"
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("preProd")
        }
        create("stagingProd") {
            initWith(buildTypes.getByName("debug"))
            isCrunchPngs = false
            isShrinkResources = false
            isMinifyEnabled = false
            isDebuggable = true
            applicationIdSuffix = ".stagingProd"
            versionNameSuffix = "-stagingProd"
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("stagingProd")
        }
        create("staging") {
            initWith(buildTypes.getByName("debug"))
            isCrunchPngs = false
            isShrinkResources = false
            isMinifyEnabled = false
            isDebuggable = true
            applicationIdSuffix = ".staging"
            versionNameSuffix = "-staging"
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("staging")
        }
        getByName("debug") {
            ext["alwaysUpdateBuildId"] = false
            isShrinkResources = false
            isMinifyEnabled = false
            applicationIdSuffix = ".dev"
            versionNameSuffix = "-dev"
            signingConfig = signingConfigs.getByName("debug")
//            configure<FirebasePerformanceExtension> {
//                setInstrumentationEnabled(false)
//            }
        }
    }
    packagingOptions {
        resources {
            excludes += "META-INF/*.kotlin_module"
        }
    }

    namespace = "com.example.xxx"
//    lint {
//        isAbortOnError = false
//        isCheckReleaseBuilds = false
//        isWarningsAsErrors = false
//    }
}

dexguard {
    path = "D:\\DexGuard\\DexGuard-9.8.0\\DexGuard-9.8.0"
    license = "D:\\DexGuard\\dexguard-license.txt"
    configurations {
        register("release") {
            defaultConfiguration("dexguard-release.pro")
            configurations("dexguard-project.txt")
        }
    }
}

dependencies {
    // region Module
    implementation(project(":feature-home"))
    implementation(project(":feature-auth"))
    implementation(project(":core-data"))
    implementation(project(":core-navigation"))
    implementation(project(":core-resource"))
    implementation(project(":core-analytics"))
    implementation(project(":core-util"))
    implementation(project(":core-integration"))
    // endregion

    // region Common
    implementation(libs.koin.android)
    implementation(libs.koin.android.compat)
    implementation(libs.koin.androidx.workmanager)
    implementation(libs.koin.androidx.navigation)
    // endregion

    // region JetPack
    implementation(libs.lifecycle.viewmodel.ktx)
    implementation(libs.lifecycle.livedata.ktx)
    implementation(libs.lifecycle.viewmodel.savedstate)
    implementation(libs.lifecycle.common.java8)
    implementation(libs.lifecycle.service)
    implementation(libs.lifecycle.process)
    // endregion

    // region Firebase
    implementation(platform(libs.firebase.bom))
    implementation(libs.firebase.analytics.ktx)
    implementation(libs.firebase.crashlytics.ktx)
    implementation(libs.firebase.perf)
    implementation(libs.firebase.config.ktx)
    implementation(libs.firebase.messaging.ktx)
    // endregion

    // region Extras
    implementation(libs.debugBanner)
    debugImplementation(libs.leakCanary)
    implementation(libs.logger)
    implementation(libs.localeHelper)
    // endregion

    // region encryption and security
    implementation(libs.sqlcipher)
    // endregion

    implementation(libs.material)
    // implementation("com.google.firebase:firebase-crashlytics-ndk")
}
apply plugin: 'kotlin-android'
//apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion versions.compileSdkVersion
    defaultConfig {
        minSdkVersion versions.minSdkVersion
        targetSdkVersion versions.targetSdkVersion
        versionCode versions.code
        versionName versions.name
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }

}

dependencies {
    //region Common

    implementation deps.stdlib
    implementation deps.kotlin_reflect
    coreLibraryDesugaring deps.jdk_lib

    //endregion
    //region JetPack

    implementation deps.appcompat

    //endregion
    //region Bithealth

    implementation deps.date_time_utils

    //endregion
    //region Extras

    implementation deps.logger
    implementation deps.timber
    implementation deps.lottie

    //endregion
    //region Local Testing

    testImplementation deps.test_core
    testImplementation deps.test_runner
    testImplementation deps.test_rules
    testImplementation deps.test_junit_ktx
    testImplementation deps.robolectric
    testImplementation deps.mockk
    testImplementation deps.test_livedata
    testImplementation deps.test_coroutine

    //endregion
    //region Instrumentation Testing

    androidTestImplementation deps.test_core
    androidTestImplementation deps.test_runner
    androidTestImplementation deps.test_rules
    androidTestImplementation deps.test_junit_ktx
    androidTestImplementation deps.test_livedata

    //endregion

    //region Encryption

    implementation deps.securityCrypto
    implementation deps.securePreferences

    //endregion

    //region Gson
    implementation deps.gson
    //endregion
}
apply plugin: 'com.android.library'
apply from: '../shared_build.gradle'

android {
    defaultConfig {
        consumerProguardFiles 'consumer-rules.pro'
    }

    buildTypes {
        release {
            buildConfigField("String", "VERSION_NAME", "\"${versions.name}\"")
            buildConfigField("String", "VERSION_CODE", "\"${versions.code}\"")
        }
        preProd {
            buildConfigField("String", "VERSION_NAME", "\"${versions.name}\"")
            buildConfigField("String", "VERSION_CODE", "\"${versions.code}\"")
        }
        stagingProd {
            matchingFallbacks = ['release']
            buildConfigField("String", "VERSION_NAME", "\"${versions.name}\"")
            buildConfigField("String", "VERSION_CODE", "\"${versions.code}\"")
        }
        staging {
            matchingFallbacks = ['release']
            buildConfigField("String", "VERSION_NAME", "\"${versions.name}\"")
            buildConfigField("String", "VERSION_CODE", "\"${versions.code}\"")
        }
        debug {
            buildConfigField("String", "VERSION_NAME", "\"${versions.name}\"")
            buildConfigField("String", "VERSION_CODE", "\"${versions.code}\"")
        }
    }
}
apply from: '../shared_build_core.gradle'

android {
    namespace 'com.siloamhospitals.doctor.core.analytics'
}

dependencies {
    //region Module

    implementation project(':core-data')
    implementation project(':core-integration')

    //endregion
    //region Common

    implementation deps.koin

    //endregion
    //region JetPack

    implementation deps.core

    //endregion
    //region Firebase

    implementation platform(deps.firebase)
    implementation deps.firebase_analytics
    implementation deps.firebase_crashlytics

    //endregion
}
Ананий
Вопрос задан5 августа 2024 г.

1 Ответ

2

Миграция Gradle Groovy в Kotlin DSL с Модуляризацией

Миграция с Gradle Groovy на Kotlin DSL — это отличный способ улучшить читаемость, поддерживаемость и масштабируемость вашего проекта. Kotlin DSL предоставляет более строгую типизацию, автоматическую генерацию кода и поддержку современных функций Kotlin. В этой статье мы рассмотрим процесс миграции, а также преимущества модуляризации для структурирования крупных проектов.

Преимущества Kotlin DSL

Переход на Kotlin DSL приносит ряд преимуществ:

1. Более строгая типизация

Kotlin DSL обеспечивает более строгую типизацию, что помогает выявить ошибки на ранней стадии разработки. Это уменьшает количество ошибок во время компиляции и делает код более безопасным.

2. Автоматическая генерация кода

Kotlin DSL автоматически генерирует код для некоторых часто используемых операций, что упрощает написание скриптов и сокращает количество ручного кода.

3. Современные функции Kotlin

Kotlin DSL предоставляет доступ к современным функциям Kotlin, таким как лямбды, null-безопасность и интеллектуальная система типов. Это делает код более читаемым, компактным и удобным в работе.

Процесс миграции

Переход на Kotlin DSL не требует полного переписывания скриптов Gradle. Вы можете постепенно мигрировать файлы по одному, используя следующие шаги:

1. Создание нового файла с расширением `.gradle.kts`

Создайте новый файл с расширением `.gradle.kts` для каждого модуля или проекта. Например, `build.gradle.kts` для корневого проекта или `module:build.gradle.kts` для модуля.

2. Перенос скриптов Gradle Groovy в Kotlin DSL

Переносите скрипты Gradle Groovy в новый файл `.gradle.kts`, используя синтаксис Kotlin DSL. Gradle предоставляет инструменты для преобразования Groovy в Kotlin DSL, которые можно использовать для упрощения процесса миграции.

3. Изменение зависимостей

Обновите зависимости в файлах `build.gradle` или `settings.gradle` на версию Kotlin DSL Gradle. Например, для Gradle 7.0:

dependencyManagement {
  imports {
    mavenBom "org.jetbrains.kotlin:kotlin-bom:$kotlin_version"
  }
}

dependencies {
  implementation "org.jetbrains.kotlin:kotlin-stdlib"
}

4. Тестирование и отладка

Тестируйте свою миграцию и исправьте ошибки, которые могут возникнуть при переходе на Kotlin DSL. Используйте отладчик и инструменты Gradle для определения и решения проблем.

Модуляризация

Модуляризация — это процесс разделения крупного проекта на независимые модули с четко определенными функциями. Это повышает структурированность проекта, упрощает его поддержку и позволяет разрабатывать отдельные части проекта независимо.

1. Создание модулей

Разделите свой проект на модули, каждый из которых отвечает за определенную функцию или часть функциональности. Например, модуль для логики приложения, модуль для UI, модуль для тестов и т.д.

2. Определение зависимостей между модулями

Определите зависимости между модулями. Например, модуль UI может зависить от модуля логики приложения.

3. Использование многомодульного проекта Gradle

Создайте многомодульный проект Gradle для управления зависимостями и сборкой отдельных модулей. В корневом проекте `settings.gradle.kts` укажите все модули проекта.

4. Использование `include` для добавления модулей

В файле `settings.gradle.kts` используйте `include` для добавления модулей в проект. Например:

include(":module1", ":module2")

5. Использование `dependencies` для определения зависимостей между модулями

В файлах `build.gradle.kts` модулей используйте `dependencies` для определения зависимостей между модулями.

dependencies {
  implementation(project(":module1"))
}

Пример миграции и модуляризации

Предположим, у вас есть проект с двумя модулями: `core` и `ui`.

1. Создание модулей

  • Создайте папку core и ui в корневом каталоге проекта.
  • Создайте файлы build.gradle.kts в каждой из папок.

2. `settings.gradle.kts`

include(":core", ":ui")

3. `core/build.gradle.kts`

plugins {
    kotlin("jvm")
}

group = "com.example"
version = "1.0"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib")
    // Другие зависимости core-модуля
}

4. `ui/build.gradle.kts`

plugins {
    kotlin("jvm")
}

group = "com.example"
version = "1.0"

repositories {
    mavenCentral()
}

dependencies {
    implementation(project(":core"))
    // Другие зависимости ui-модуля
}

5. Запуск сборки

Используйте `gradlew build` для сборки проекта. Gradle автоматически создаст зависимости между модулями и соберет все необходимые артефакты.

Заключение

Переход на Kotlin DSL и модуляризация — это отличный способ улучшить структурированность, читаемость и поддерживаемость вашего проекта Gradle. Используйте эти рекомендации, чтобы сделать ваш код более эффективным и масштабируемым.

Руслан
Ответ получен2 сентября 2024 г.

Ваш ответ

Загрузить файл.