`
wensong
  • 浏览: 127333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Gradle Plugin开发手记

阅读更多

        最近手头需要开发一个Gradle插件,于是研究了几天,基本实现了一个Gradle插件。总结一下Gradle插件开发的步骤。

  • 首先需要建一个gradle工程,需要添加以下依赖
dependencies {
    compile gradleApi()
    compile 'org.codehaus.groovy:groovy:2.1.5'
}
  • 例如:新建一个groovy工程testPlugin,build.gradle如下,注意我这里为了简单使用的本地的maven库,发布到本地文件,都可以改成maven资源库。
apply plugin: "groovy"
apply plugin: "maven"

group = "my.test"
version = "1.0-SNAPSHOT"

defaultTasks 'clean', 'jar'

sourceSets {
    main {
        groovy {
            srcDirs = [
                'src/main/groovy',
                'src/main/java'
            ]
        }  // compile everything in src/ with groovy
        java { srcDirs = []}    // no source dirs for the java compiler

    }
}

repositories { mavenLocal() }

dependencies {
    tasks.withType(Compile) { options.encoding = "UTF-8" }
    compile 'org.codehaus.groovy:groovy:2.1.5'
    compile gradleApi()
}


// custom tasks for creating source jars
task sourcesJar(type: Jar, dependsOn:classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

// add source jar tasks as artifacts
artifacts { archives sourcesJar }

// upload to local
uploadArchives {
    repositories { flatDir { name 'localRepository' } }
    repositories { localRepository { dirs '../local-repo' } }
}

 

  •  配置sourceSets
    • 注意gradle编译时,先执行compileJava,后执行compileGroovy
    • gradle源码中compileGroovy是dependsOn compileJava的
    • 解决java&groovy混合编译的问题
      • 当java执行需要groovy编译完的class时,可以通过设置sourceSets来解决这个问题,即把java对应的srcDirs置为空,把java的src放入groovy中的srcDirs中,如下代码所示
sourceSets {
    main {
        groovy { srcDirs = ['src/main/groovy','src/main/java']}  // compile everything in src/ with groovy
        java { srcDirs = []}    // no source dirs for the java compiler

    }
}
  •  实现Plugin接口,完成插件的实现
    • 插件可以是用Groovy编写,也可以是Java来编写,参考各自API即可  
    • 例如,我这里写了个简单的插件,为了混编java和groovy,实现java里获得groovy(build.gradle)中的变量,这个插件用两种方式给工程建立了两个task,注意TestPluginConvention是个groovy编译后的class
package com.test.gradle;

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.tasks.Copy;

import com.test.task.TestTask;

public class TestPlugin implements Plugin<Project> {

    @Override
    public void apply(final Project project) {
        
        // 引用groovy扩展变量
        final TestPluginConvention pluginConvention = new TestPluginConvention(project);
        project.getConvention().getPlugins().put("testPlugin", pluginConvention);
        
        // 创建hello任务
        project.getTasks().add("hello", TestTask.class);
        
        // 创建copyAll任务
        Copy copyTask = project.getTasks().add("copyAll", Copy.class);
        copyTask.dependsOn(project.getPath() + ":jar");
        copyTask.from(project.getConfigurations().getByName("runtime"));
        copyTask.from(project.getBuildDir().getPath() + "/classes/main");
        copyTask.from(project.getBuildDir().getPath() + "/classes/resources");
        copyTask.into(project.getBuildDir().getPath() + "/dist");
    }

}
 
package com.test.task;

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;

import com.test.gradle.TestPluginConvention;

public class TestTask extends DefaultTask {

    @TaskAction
    public void test() {
        System.out.println("hello " + getProject().getName());
        System.out.println("TestPlugin ext testName:"
                + ((TestPluginConvention) getProject().getConvention().getPlugins()
                        .get("testPlugin")).getTestName());
    }

    public void test2(Object object) {
        System.out.println("to object:" + object);
    }

}
package com.test.gradle;

import org.gradle.api.Project

public class TestPluginConvention {

    String testName;
    final Project project;

    def TestPluginConvention(Project project){
        this.project = project;
        testName = 'test';
    }

    public String getTestName(){
        return testName;
    }
}
 
  • 在gradle工程中配置gradle plugin配置文件
    • 在src/main/resources源码目录下,新建文件夹META-INF/gradle-plugins/,在文件夹里新建一个xxxx.properties,文件里内容如下
      implementation-class=com.test.gradle.TestPlugin
      • 注意
        • xxxx.properties的xxxx为插件的名字,即在gradle配置中可以apply plugin ‘xxxx'
        • xxx.xxx.xxx为org.gradle.api.Plugin的实现类的类名
   工程结构如下


  • 打包发布到资源库,可以是本地,也可以是maven库中
  • 使用插件
    • 在build.gradle引入插件
      • apply plugin: ‘xxxx’
        
         
    • 在build.gradle 里引入buildscript

buildscript {

    repositories { flatDir { name 'localRepository'

        } }

    repositories { localRepository { dirs '../local-repo'

        } }

    dependencies {

        classpath group: 'my.test', name: 'testPlugin', version: '1.0-SNAPSHOT'

    }

}

 

 

 

  • 测试插件工程的gradle build.gradle如下
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'maven'
apply plugin: 'test'

buildscript {
    repositories { flatDir { name 'localRepository'
        } }
    repositories { localRepository { dirs '../local-repo'
        } }
    dependencies {
        classpath group: 'my.test', name: 'testPlugin', version: '1.0-SNAPSHOT'
    }
}

testName = "wensong"
group = "com.test"
version = "1.0-SNAPSHOT"

 

  • 测试结果,可以看到TestTask中成功的拿到了build.gradle中的testName,并完成输出


 

 

  • 大小: 44.1 KB
  • 大小: 36.4 KB
分享到:
评论

相关推荐

    Android Gradle Plugin User Guide

    《Android Gradle Plugin用户指南》是一份详细的文档,旨在帮助...无论你是新手还是经验丰富的开发者,这份指南都能帮助你更好地理解和利用Android Gradle Plugin,提升开发效率,实现更高质量的Android应用开发。

    Android代码-jmh-gradle-plugin

    = JMH Gradle Plugin :jmh-version: 1.21 :plugin-version: 0.4.8 image:http://img.shields.io/travis/melix/jmh-gradle-plugin/master.svg["Build Status (travis)", link=...

    gradle时间记录器插件gradle plugin to log.zip

    现在你可以用Gradlekotlin DSL来做一个完整的例子,检查https://github.com/skyscanner/gradle-time-logger-plugin/tree/master/exampleConsole报告程序控制台报告程序将所有信息转储到生命周期记录器mixpanel报告...

    Gradle Plugin 修改其class 字节码的Demo

    在Android开发中,Gradle Plugin扮演着至关重要的角色,它是一种强大的构建工具,允许开发者自定义构建过程。本文将深入探讨如何使用Gradle插件来修改class字节码,这在进行代码混淆、性能优化或者实现特定功能时...

    Gradle-Plugin-User-Guide-Chinese-Verision, Gradle Plugin User Guide 中文翻译.zip

    总之,《Gradle插件用户指南中文版》是学习和实践Gradle插件的宝贵资源,它涵盖了从基础用法到高级特性的全方位指导,帮助开发者充分利用Gradle的强大功能,提升开发效率和构建质量。无论你是初学者还是经验丰富的...

    Android Gradle Plugin7.1.2源码

    Android Gradle Plugin7.1.2源码,直接在项目中依赖就可以查看源码

    gradle elcipse plugin

    Gradle Eclipse Plugin是Gradle构建工具的一个重要组成部分,它允许开发者将Gradle项目与Eclipse集成,以便在Eclipse IDE中进行开发、调试和构建工作。这个插件提供了从Gradle构建到Eclipse工程配置的无缝转换,使得...

    Android Gradle Plugin

    使用AndroidStudio的时候,对Gradle的配置完全不同,苦于找不到源码,所以我找了一份,供大家下载!下载过程在这里有描述:http://blog.csdn.net/lslxdx/article/details/50165613

    android-maven-gradle-plugin,与android库项目兼容的gradle的maven插件.zip

    虽然面对Gradle的频繁更新,开发者需要时刻关注插件的兼容性问题,但这仍然是一个值得信赖的工具,为Android开发带来了极大的便利。对于开源项目而言,合理运用Android Maven Gradle 插件能有效提升项目的可见度,...

    composer-gradle-plugin,Gradle任务类型和与之交互的插件.zip

    《Composer Gradle Plugin:Gradle任务类型与插件的深度解析》 在现代软件开发中,构建工具扮演着至关重要的角色。Gradle作为一款强大的、灵活的自动化构建工具,广泛应用于Java、Android等项目的构建。它允许...

    gradle-plugin-0.10.0.zip

    对于想要深入了解Gradle插件开发的开发者,"sdk-manager-plugin"是一个很好的实践案例。通过阅读和分析源码,可以学习如何编写Gradle插件,如何与Android SDK交互,以及如何自动化构建流程。 总结来说,尽管"gradle...

    L21-Gradle Plugin-讲义.pdf

    这份讲义“L21-Gradle Plugin”深入探讨了Gradle插件的开发和使用,尤其是Groovy语言在其中的应用。 首先,Groovy是一种动态类型的JVM语言,它与Java语法相似但更为简洁。在Groovy中,你可以省略getter和setter方法...

    Gradle plugin to check library licenses and generate license pages.zip

    综上所述,`Gradle plugin to check library licenses and generate license pages.zip` 是开源项目许可证管理的得力助手,它将繁琐的手动工作自动化,提高了开发效率,同时也确保了项目遵守开源许可证的要求,为...

    dexcount-gradle-plugin,一个gradle插件,用于报告每个构建的apk中方法引用的数量。.zip

    然后,在模块级别的build.gradle文件中,应用插件并配置输出选项,比如在`apply plugin`下面添加: ```groovy apply plugin: 'com.getkeepsafe.dexcount' dexcount { format = 'markdown' // 可选格式:text、...

    如何使用Android Studio开发Gradle插件(一)

    在Android开发领域,Gradle是主流的构建工具,而自定义Gradle插件则能极大地提升项目的构建效率和灵活性。本文将深入探讨如何使用Android Studio开发Gradle插件,主要分为以下几个方面: 1. **Gradle插件基础** - ...

    Android代码-dexcount-gradle-plugin

    Dexcount Gradle Plugin A Gradle plugin to report the number of method references in your APK or AAR on every build. This helps you keep tabs on the growth of your app, with an eye to staying ...

    Gradle plugin to optimize png files.zip

    总的来说,"Gradle plugin to optimize png files"是一个非常实用的工具,它简化了Android开发中的资源优化工作,提高了构建效率,同时也帮助开发者创建更小、更快的APK应用。通过开源的方式,这个项目不断接受社区...

    Android Gradle 项目样例

    讲解 Gradle Plugin 中 sourceSets 元素。 Gradle Library Projects 讲解 Gradle 依赖。包含 .jar 依赖, Library project 依赖, Maven 依赖。 Gradle Build Configs 讲解 APK 打包时的签名设置。 Gradle Build ...

    eclipse gradle plugin - buildship,最新20170713的snapshot,支持mars,oxgen

    支持采用link方式安装!...eclipse gradle plugin的2017.7.13shapshot版,在从oxgen版本开始,eclipse j2ee开发版已经默认带上此插件。如果要使用最新的版本或者在mars等默认不带gradle插件的版本则可以使用此插件。

Global site tag (gtag.js) - Google Analytics