美文网首页
在buildSrc中使用kotlin

在buildSrc中使用kotlin

作者: pdog18 | 来源:发表于2018-10-01 09:00 被阅读86次

    如果你在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 之后。

    相关文章

      网友评论

          本文标题:在buildSrc中使用kotlin

          本文链接:https://www.haomeiwen.com/subject/megioftx.html