zoukankan      html  css  js  c++  java
  • 新建一个Gradle

    增加自己的自定义plugin,使用的是最简单的那种, 在项目下创建一个buildSrc Java Module,然后在apply哪里改:

    // 引入对应的plugin
    apply plugin: 'groovy'
    apply plugin: 'java'
    
    dependencies {
        implementation gradleApi()// 引入gradle api
        implementation localGroovy()// 引入groovy
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    }
    
    sourceSets {// 源码地址
        main {
            groovy {
                srcDir 'src/main/groovy'
            }
    
            java {
                srcDir "src/main/java"
            }
    
            resources {
                srcDir 'src/main/resources'
            }
        }
    }
    
    sourceCompatibility = "7"
    targetCompatibility = "7"
    

    这个就是完整的gradle文件配置,通过这个配置之后,在添加对应的plugin以及task即可,

    public class FirstPlugin implements Plugin<Project> {
        @Override
        public void apply(Project project) {
            // 新建一个名为hello的task,实际调用为MyTest
            project.getTasks().create("hello", MyTest.class, new Action<MyTest>() {
                @Override
                public void execute(MyTest myTest) {
                    // 这里调用task
                    myTest.str = "xuepanjie";
                    myTest.say();
                    myTest.str = "hello";
                }
            });
        }
    } // plugin 代码
    
    public class MyTest extends DefaultTask {
        public String str;
    
        @TaskAction
        public void say(){
            System.out.print(str);
        }
    }// task代码
    

    这时如果在App内的plugin apply对应的first plugin,那么在执行assembleDebug的时候就会调用这个新增的Plugin了,这里可以增加自己的task也可以增加自己的transform,当然也可以不在这里增加buildSrc这种方式,而改成独立的moudle然后发布之后在目标app去依赖即可,类似booster这种方式。

    即使这种简单的加法也遇到问题,问题是在新建module的时候选择了library,应该选择java那种形式然后修改对应的build文件才行。

    借鉴:https://guides.gradle.org/writing-gradle-plugins/

    使用非buildSrc新建gradle的方法和这个类似,只是命名为someName即可,然后在目标module的gradle脚本中增加当前plugin的group和version信息,之后新增一个编译上传脚本,当这个plugin编译完成后发布,在别的app内根据这个group以及version去依赖即可。

    // 版本以及组信息
    version 1.0
    group "com.geektime.asm"
    
    apply from: rootProject.file('gradle/java-publish.gradle')
    

    上面的是在对应的新建plugin内build新增代码

    // 发布plugin代码
    // 借鉴shaowen老师的github
    task buildAndPublishToLocalMaven(type: Copy, dependsOn: ['build', 'publishToMavenLocal']) {
        group = 'geektime'
    
        // save artifacts files to artifacts folder
        from configurations.archives.allArtifacts.files
        into "${rootProject.buildDir}/outputs/artifacts/"
        rename { String fileName ->
            fileName.replace("release.aar", "${version}.aar")
        }
    
        doLast {
            println "* published to maven local: ${project.group}:${project.name}:${project.version}"
        }
    }
    

    创建非buildSrc的plugin

    仿造shaowen大佬写的用非buildSrc形式创建新的plugin,遇到了挺多问题,首先由于buildSrc是基于Java library的创建的,导致我在导包的时候各种问题,主要是asm等包导入的时候一直报错,至今不知原因,换成新建一个正常的android library就OK了,只需要把原来的代码和build.gradle挪过去,这里就是简单的完成,接着就是将发布到本地的脚本也移植过去,这时候按照原来的步骤,先发布jar包到本地,这里的配置是在module的根目录增加gradle.properties文件,这里设定一些信息,例如pluginname等,这时候发布好了,然后在项目跟目录的build.gradle里面配置新编译出来的jar包信息使用classpath引入,这样在app就能使用jar包里面的plugin了。

    这时候还有一个问题,因为这是一个gradle插件,所以需要apply,不能直接implemation这种方式,本身他们含义也不同。

    这时候还有一个问题就是少加了一个resources(也可以不加,那就直接按照包名去apply),需要在里面增加META-INF.gradle-plugins,下面有一个plugin别名的文件,内容是指向我们需要apply的plugin,加上这个然后再在app引入就完美运行了。

    这时候再在新的module里面写各种task或者transform都可以了,这也是插桩等的第一步。

  • 相关阅读:
    函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
    案例:新增数组方法
    案例:商品查询
    案例:forEach和some区别
    ES5新增方法(数组,字符串,对象)
    案例:借用父构造函数继承属性和方法
    构造函数 和 原型
    汽车小常识别让六大汽车驾驶软肋阻碍你
    Opencv 图像增强和亮度调整<6>
    C# StringBulider用法<1>
  • 原文地址:https://www.cnblogs.com/pjex/p/createNewGradle.html
Copyright © 2011-2022 走看看