如果你在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来写
但是在自定义的subProject
写plugin
调试的时候需要上传到本地仓库然后再下载,考虑到缓存每次改版本号,累的要死
所以一般我们都会选择在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.gradle
和rootProject#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
可以很直观的看出来
buildSrc
的Configuration
会发生在rootProject
的Configuration
之前
所以如果在buildSrc#build.gradle
中进行一些远程的plugin
的apply
的话,那么需要为这些plugin
声明来源,因为在rootProject
中声明的来源一不会被传递到,二执行也在buildSrc
之后。
网友评论