在buildSrc中使用kotlin

如果你在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 輸出,然后執(zhí)行

// 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 會發(fā)生在rootProjectConfiguration 之前

所以如果在buildSrc#build.gradle 中進行一些遠程的pluginapply 的話,那么需要為這些plugin 聲明來源,因為在rootProject中聲明的來源一不會被傳遞到,二執(zhí)行也在buildSrc 之后。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容