gradle入门(一)从Groovy DSL转化为KTS

  • Post author:
  • Post category:其他




前言

kts是指Kotlin脚本,这是gradle 在构建配置文件中使用的一种Kotlin语言形式,kotlin 脚本是可以从命令行运行的Kotlin代码。 kotlin DSL 主要是指Android gradle 插件kotlin DSL ,有时候也指底层的gradle kotlin DSL。用Kotlin 编写的gradle build 文件使用 .gradle.kts 作为文件的扩展名。



正文

从事Android已经很多年了,也尝试学习过gradle。时到如今,回过头来思考的时,思考了下整个学习过程中的痛点,无法直接点击查看源码是真的痛苦,通过implementation 导入源码倒是一种思路,难受总归是难受。

那么有什么方式可以直接点击跳转到源码吗?那就是KTS。我的想法是直接从简单的Demo工程转换为KTS,我们通过KTS去理解调用源码,然后切换成groovy去写脚本。

大致修改步骤:

  • 创建同名不同后缀的gradle 文件
  • 删除掉Groovy版本的文件或者拷贝到其他位置。
  • 编写Kotlin版本的代码
  • 同步



简单修改



settings.gradle

这个是项目最开始识别的文件,同时也是最简单的文件。

  • 项目根目录下创建一个settings.gradle.kts 文件
  • 复制Groovy版本的代码到kts上
  • 删除Groovy版本的文件
  • 基于kts修改文件
rootProject.name = "StartDebug"
include(":app")

重要一点,就是基于Kotlin语法。只有两行代码。还是有明显的区别的:

rootProject.name = "StartDebug"

这个代码调用的是rootProject.setName() 函数。引导组件也变成了函数的调用。



项目的build.gradle

这个是相对复杂的,因为涉及到导入插件,设置Android 闭包属性。导入第三方库,编译配置等等。因为插件是根目录下的build.gradle 配置的。所以说,建议优先改这个,要不然根目录下的build.gradle 出问题了,会提示这里面的插件找不到。 人都麻了。

  • 基于build.gradle 复制一个,修改为:build.gradle.kts
  • 将kts 中的Groovy代码注释掉。(也可以不注释,直接运行,他会提示报错的位置,然后基于报错的位置进行修改就行)
  • 修改代码
plugins {
    id("com.android.application")
}
​
android {
    compileSdkVersion(30)
    buildToolsVersion("30.0.2")
    defaultConfig {
        applicationId="com.nuoye.myrouter"
        setMinSdkVersion(16)
        setTargetSdkVersion(30)
        versionCode =1
        versionName ="1.0"
​
        testInstrumentationRunner="androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        getByName("release"){
            setMinifyEnabled(false)
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility =JavaVersion.VERSION_1_8
        targetCompatibility =JavaVersion.VERSION_1_8
    }
}
​
dependencies {
    implementation ("androidx.appcompat:appcompat:1.2.0")
    implementation ("com.google.android.material:material:1.2.1")
    implementation ("androidx.constraintlayout:constraintlayout:2.0.1")
    implementation(project(":bindview"))
    testImplementation ("junit:junit:4.+")
    androidTestImplementation ("androidx.test.ext:junit:1.1.2")
    androidTestImplementation ("androidx.test.espresso:espresso-core:3.3.0")
}

通过上面可运行代码和Groovy版本进行对比。我们发现buildType 改动较大。其他都是基于Kotlin语法进行更改。



根目录的build.gradle

这个相对而言较为地复制一点,因为他里面的脚本代码较多。

  • 基于build.gradle 复制一个,修改为:build.gradle.kts
  • 将kts 中的Groovy代码注释掉。(也可以不注释,直接运行,他会提示报错的位置,然后基于报错的位置进行修改就行)
  • 修改代码
​
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:4.0.2")
    }
}
​
allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
​
tasks{
    register("clean",Delete::class){
        setDelete(buildDir)
    }
}

上面是修改完成后的代码,通过上面的代码和原来Groovy代码进行对比。我们其实只是修改了几个位置:

  • classpath 导入插件的方式,通过函数调用了,而且Kotlin的导入也和其他时候不同,不需要设置包名了。
  • maven 的也是调用了函数和闭包,和Groovy也明显不同。
  • 最大的差异在 clean 任务,在kts 中需要通过上述代码注册进去。



其他函数



ext的定义和获取

在根目录下:

ext{
    set("luoye","nuoye")
    set("luoye1","nuoye")
    set("luoye2","nuoye")
}

获取:

rootProject.ext.get("luoye")



定义产品风味

flavorDimensionList.apply {
        add("channel")
        add("cpu")
    }
    productFlavors {
        create("baidu") {
            dimension="channel"
        }
        create ("huawei"){
            dimension="cpu"
        }
    }



结束

其实,这只是一种思路。可能我比较笨,我更喜欢有代码提示和可以点击查看源码,groovy那种没有提示的代码,写着贼难受。当然可以使用 implementation 或者仅仅编译时导入的那种模式导入源码。

我在buildSrc 中这么导入gradle和groovy

//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()



资料



版权声明:本文为u013962582原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。