插件本身不能添加 buildscript 依赖然后应用 dokka-android 插件

Posted

技术标签:

【中文标题】插件本身不能添加 buildscript 依赖然后应用 dokka-android 插件【英文标题】:Plugin itself can't add buildscript dependencies and then apply dokka-android plugin 【发布时间】:2019-01-01 21:04:59 【问题描述】:

我们创建了GradleMavenPush 插件,用于执行将工件(Gradle android Artifacts、Gradle Java Artifacts 和 Gradle Kotlin Artifacts)上传到 Maven 存储库(JCenter、Maven Central、Corporate staging/snapshot 服务器和本地 Maven 存储库)

GradleMavenPush插件本身不能添加buildscript依赖然后应用dokka-android插件:

buildscript 
    repositories 
        jcenter()
    

    dependencies 
        classpath "org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.17"
    


apply plugin: 'org.jetbrains.dokka-android'

未找到 ID 为“org.jetbrains.dokka-android”的插件。

Can a plugin itself add buildscript dependencies and then apply a plugin? 的解决方案也不起作用:

apply plugin: 'groovy'

repositories 
    jcenter()


dependencies 
    compile gradleApi()
    compile localGroovy()

    compile "org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.17"


apply plugin: 'org.jetbrains.dokka-android'

未找到 ID 为“org.jetbrains.dokka-android”的插件。

您能提供任何帮助吗?

【问题讨论】:

【参考方案1】:

您应该将将近 1000 行脚本插件代码转换为真正的二进制 Gradle 插件。对于该二进制插件,您可以指定依赖项,只要将您的插件添加为 Gradle 构建脚本的 classpath 依赖项,就会解析这些依赖项。从那里开始,您可以简单地从您的插件中应用其他插件,因为其他插件的类将可供您使用。

您提供的 Gradle 讨论链接已经解释了为什么您会遇到某种鸡或蛋问题。第二个代码示例确实为您的插件项目提供了一个可能的build.gradle 文件,它不能直接在脚本插件中使用。

【讨论】:

@lu-koerfer 我实现了自己的解决方案,以在脚本 gradle 插件中支持 Dokka,请参见上文。我们喜欢您将我们的脚本插件代码转换为真正的二进制 Gradle 插件的想法。请问sent Pull Request to us好吗?谢谢。【参考方案2】:

上述解决方案不适用于 script gradle 插件(仅适用于二进制 gradle 插件)

我实现了自己的solution for support Dokka in script gradle plugins。

对于 Android Java/Kotlin 项目:

        task androidDokka(type: Exec) 
            downloadFile('https://jcenter.bintray.com/org/jetbrains/dokka/dokka-fatjar/0.9.17/dokka-fatjar-0.9.17.jar', 'dokka-fatjar.jar')
            def srcDirsNumber = android.sourceSets.main.java.srcDirs.size()
            def classpathNumber = android.getBootClasspath().size()
            def classpath = (classpathNumber > 0) ? android.getBootClasspath()[0] : ''
            def javaAPISpecificationLink = getJavaAPISpecificationLink()
            if (srcDirsNumber > 0) 
                commandLine 'java', '-jar', "$buildDir/download/dokka-fatjar.jar",
                        android.sourceSets.main.java.srcDirs[0],
                        (srcDirsNumber == 2) ? android.sourceSets.main.java.srcDirs[1] : '',
                        (srcDirsNumber == 3) ? android.sourceSets.main.java.srcDirs[2] : '',
                        '-output', "$buildDir/javadoc", '-format', 'javadoc',
                        (classpathNumber > 0) ? '-classpath' : '', (classpathNumber > 0) ? classpath : '',
                        '-links', "https://developer.android.com/reference/^$android.sdkDirectory/docs/reference/^$javaAPISpecificationLink"
             else 
                commandLine 'java', '-jar', "$buildDir/download/dokka-fatjar.jar"
            
        

        task androidDokkaJar(type: Jar, dependsOn: androidDokka) 
            classifier = 'javadoc'
            from "$buildDir/javadoc"
        

对于其他 Java/Kotlin 项目(非 Android):

        task coreDokka(type: Exec) 
            downloadFile('https://jcenter.bintray.com/org/jetbrains/dokka/dokka-fatjar/0.9.17/dokka-fatjar-0.9.17.jar', 'dokka-fatjar.jar')
            def srcDirsNumber = sourceSets.main.java.srcDirs.size()
            def javaAPISpecificationLink = getJavaAPISpecificationLink()
            if (srcDirsNumber > 0) 
                commandLine 'java', '-jar', "$buildDir/download/dokka-fatjar.jar",
                        sourceSets.main.java.srcDirs[0],
                        (srcDirsNumber == 2) ? sourceSets.main.java.srcDirs[1] : '',
                        (srcDirsNumber == 3) ? sourceSets.main.java.srcDirs[2] : '',
                        '-output', "$buildDir/javadoc", '-format', 'javadoc',
                        '-links', "$javaAPISpecificationLink"
             else 
                commandLine 'java', '-jar', "$buildDir/download/dokka-fatjar.jar"
            
        

        task dokkaJar(type: Jar, dependsOn: coreDokka) 
            classifier = 'javadoc'
            from "$buildDir/javadoc"
        

【讨论】:

以上是关于插件本身不能添加 buildscript 依赖然后应用 dokka-android 插件的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 中 buildscript 块的用途

Gradle buildscript 依赖项

在Gradle脚本中使用第三方依赖

无法将插件 DSL 与 buildscript 块结合使用

使用Spring Boot Gradle插件的多模块项目

创建自定义插件并在另一个构建脚本中使用它