在buildSrc中使用kotlin

2018-10-01  本文已影响86人  pdog18

如果你在rootProject#build.gradle 中声明了

buildscript {
    repositories {
        mavenCentral()
        //..
    }

    dependencies {
        classpath "com.android.tools.build:gradle:3.0.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.41"
    }
}

然后在其他项目中写plugin,例如a-plugin#build.gradle 中声明

apply plugin: 'java-gradle-plugin'
apply plugin: 'kotlin'

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

dependencies {
    compileOnly gradleApi()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.41"
    implementation "com.android.tools.build:gradle:3.0.1"
}

那肯定没有问题,可以正常直接用kotlin来写

但是在自定义的subProjectplugin 调试的时候需要上传到本地仓库然后再下载,考虑到缓存每次改版本号,累的要死

所以一般我们都会选择在buildSrc 中写,在buildSrc#build.gralde 中,我们还是向上面那样写,那么肯定会报错,编译不了

Error:(2, 0) Plugin with id 'kotlin' not found.

这时候你需要在buildSrc#build.gralde 中添加对应的内容,声明plugin 的来源
完整的声明如下

apply plugin: 'java-gradle-plugin'
apply plugin: 'kotlin'

buildscript {
    ext.kotlin_version = '1.2.41'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compileOnly gradleApi()
    compileOnly localGroovy()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

为什么会这样呢?

我们分别在buildSrc#build.gradlerootProject#build.gralde 中添加对应的Log 输出,然后执行

// buildSrc
println("buildSrc config")
// rootProject
println("rootProject config")

Gradle Console 中可以看到输出

Configuration on demand is an incubating feature.
buildSrc config
:buildSrc:compileKotlin UP-TO-DATE
// 省略其他task
rootProject config
:app:preBuild UP-TO-DATE
// 省略其他task

可以很直观的看出来

buildSrcConfiguration 会发生在rootProjectConfiguration 之前

所以如果在buildSrc#build.gradle 中进行一些远程的pluginapply 的话,那么需要为这些plugin 声明来源,因为在rootProject中声明的来源一不会被传递到,二执行也在buildSrc 之后。

上一篇下一篇

猜你喜欢

热点阅读