编写 Gradle 插件时的 Gradle Api Sources 和 Doc

Posted

技术标签:

【中文标题】编写 Gradle 插件时的 Gradle Api Sources 和 Doc【英文标题】:Gradle Api Sources and Doc when writing Gradle Plugins 【发布时间】:2014-05-06 19:33:43 【问题描述】:

问题:

如何获取集成到 Eclipse 项目中的 gradle-api 代码的源代码和 javadoc/groovydoc?

背景:

我正在使用 Gradle 构建我正在编写的 Gradle 插件。我使用 Eclipse 作为这个项目的 IDE,而我用于构建这个插件的 Gradle 脚本正在使用“Eclipse”插件来生成我的 Eclipse 项目。另外,我正在使用 Spring 的 Gradle Eclipse 插件,它从我的 build.gradle 文件中获取我所有的依赖项。

这个 Gradle 脚本的依赖块有

dependencies 
    compile localGroovy()
    compile gradleApi()
    // I want something like: 'compile gradleApiSources()' here
    // I want something like: 'compile gradleApiDoc()' here as well

理由:

在我学习编写 Gradle 插件的过程中,如果能够查看 Gradle 的文档甚至是实现,以帮助我了解自己在做什么,将会很有帮助。

【问题讨论】:

相关buggithub.com/gradle/gradle/issues/1003 【参考方案1】:

这在 Eclipse 中对我有用:

plugins.withType(EclipsePlugin) 
    plugins.withType(JavaBasePlugin) 
        eclipse 
            classpath 
                file 
                    whenMerged  classpath ->
                        String gradleHome = gradle.getGradleHomeDir()
                            .absolutePath
                            .replace(File.separator, '/')
                        String gradleSourceDirectory = "$gradleHome/src"
                        classpath.entries.each  entry ->
                            if (entry in org.gradle.plugins.ide.eclipse.model.AbstractLibrary
                                    && entry.library.path.contains('generated-gradle-jars')) 
                                entry.sourcePath =
                                    new org.gradle.plugins.ide.eclipse.model.internal.FileReferenceFactory()
                                        .fromPath(gradleSourceDirectory)
                            
                        
                    
                
            
        
    

确保您的 Gradle Home 包含源目录。如果您使用包装器,可以通过在包装器任务中将distributionUrl 更新为-all 版本来完成。

您还需要停止正在运行 otherwise they will keep their own "home":./gradlew --stop 的 Gradle 守护程序,然后您可以继续运行任务:./gradlew eclipse

见GRADLE-2133(此答案改编自)

【讨论】:

如果我用 gradleSrc 替换 sourcePath 那么它适用于我的分发services.gradle.org/distributions/gradle-4.3-all.zip【参考方案2】:

我没有关于 eclipse 的答案,但我可以告诉你我是如何为 intellij 做到这一点的,这可能会给你一些启发。如果这个更容易获得就好了。

private void addGradleSourceDeps() 
    PathFactory pf = new PathFactory()
    pf.addPathVariable('GRADLE_HOME', project.gradle.gradleHomeDir)
    project.extensions.idea.module.iml.whenMerged  Module module ->
        module.dependencies.grep 
            it instanceof ModuleLibrary && ((ModuleLibrary) it).classes.grep  Path path ->
                path.relPath.substring(path.relPath.lastIndexOf('/') + 1).startsWith('gradle-')
            
        .each  ModuleLibrary lib ->
            // TODO this needs to be fixed for gradle 1.9 which now includes separate sub directory for each jar
            // for now a workaround is to execute the following
            // cd $GRADLE_HOME
            // for each in $(find . -mindepth 2 -maxdepth 2 -type d ! -name META\-INF); do cp -a $each .;done
            lib.sources.add(pf.path('file://$GRADLE_HOME$/src'))
        
        module.dependencies.grep 
            it instanceof ModuleLibrary && ((ModuleLibrary) it).classes.grep  Path path ->
                path.relPath.substring(path.relPath.lastIndexOf('/') + 1).startsWith('groovy-all')
            
        .each  ModuleLibrary lib -> lib.sources.add(pf.path('file://$GROOVY_SRC_HOME$')) 
    

这依赖于我已将 gradle src 发行版安装到通过 intellij 中的 GRADLE_HOME 路径变量可用的位置(对于 GROOVY_SRC_HOME 类似)。您还可以看到我的插件当前使用 gradle 1.8,src 布局在 1.9 中发生了变化,所以我需要在升级时修复这个问题。

【讨论】:

以上是关于编写 Gradle 插件时的 Gradle Api Sources 和 Doc的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 与 AGP 构建 API: 进一步完善您的插件!

Android Gradle 插件Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置与 Gradle 配置关联 ) ★

如何解决安装 warp10-ext-influxdb 插件时的 gradle shadowJar 问题?

Android Gradle 插件Gradle 依赖管理 ④ ( Android Gradle 插件中注册的依赖分组 | implementation | api | compileOnly )

在编写 Gradle 插件时我是不是应该影响 Kotlin

Java Gradle API 的 Maven 依赖参数是啥?