• buildSrc 定义插件(1)


    1. 创建 Plugin

    在完成几个自定义 gradle 插件之后,我们发现 buildSrc 方式的开发效率是最高的,因为 buildSrc 是默认的插件目录,并且该目录与独立工程的插件目录一样,能够发布插件。该目录下的代码会在构建时自动进行编译打包,然后会被添加到 buildScript 中的 classpath 下,所以不需要其它配置,就可以被其它模块中的 gradle 脚本引用。

    1. buidSrc 的执行时机比 settings.gralde 更早
    2. settings.gralde 中应删除 ‘:buildSrc’,因为在这个文件中配置,那么 buildSrc会被当做子 Project,即使在 setting.gralde 下声明了 buildSrc,也会报'buildSrc' cannot be used as a project name as it is a reserved name错误
    /*
    1. 新建 buildSrc module
    2. 配置 groovy、resource 目录,去掉 java目录
    timer
    - buildSrc
      - src
      	- main
      		- groovy
      		- resource
      - .gitignore
      - build.gradle
    */
    
    // buildSrc\build.gradle
    plugins {
        id 'java-library'
        id 'groovy' // groovy 语言
        id 'java-gradle-plugin'
    }
    
    repositories {
        google()
        mavenCentral()
    }
    
    sourceSets {
        main{
            groovy{
                srcDir 'src/main/groovy'
            }
            resources {
                srcDir 'src/main/resource'
            }
        }
    }
    dependencies {
        implementation localGroovy()
        implementation gradleApi()
        
        // 以下依赖需要在此 gralde 中配置 repositories
        
        // Android DSL
        implementation "com.android.tools.build:gradle:7.0.2"
    	// ASM V9.1
        implementation 'org.ow2.asm:asm:9.1'
        implementation 'org.ow2.asm:asm-commons:9.1'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    我们再自定义一个 Plugin

    // groovy\com\monk\customplugin\CustomPlugins.groovy
    class CustomPlugins implements Plugin<Project> {
        @Override
        void apply(Project project) {
            println "Hello Plugins ${project.name}"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在 resource 下先新建个层级目录META-INF\gradle-plugins,然后在该目录下新建一个 [插件所在包名].properties 文件,文件内使用 implementation-class 标记插件(注:该做法可使用 gradlePlugin 方式自动实现,具体可参考customlib自定义插件方式)

    // resource\META-INF\gradle-plugins\com.monk.customplugin.properties
    implementation-class=com.monk.customplugin.CustomPlugins
    
    • 1
    • 2

    最后在我们 app\build.gradle 下使用apply plugin: 'com.monk.customplugin',sync 后即可显示该插件的输出。如果已经存在 plugins{} 方式,apply plugin 必须置于 plugin{} 下边,才能避免编译出错

    > Configure project :app
    Hello Plugins app
    
    • 1
    • 2

    2. 自定义 Extension

    自定义扩展属性,让使用插件这有配置插件的能力。首先定义一个属性类

    // groovy\com.monk.customplugin.ReleaseInfoExt.groovy
    class ReleaseInfoExt{
        String versionName
        String versionCode
        String versionInfo
        String fileName
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接着在 Plugin 中进行声明

    // groovy\com\monk\customplugin\CustomPlugins.groovy
    class CustomPlugins implements Plugin<Project> {
        @Override
        void apply(Project project) {
            println "Hello Plugins --buildSrc: ${project.name}"
    
            // 创建用于设置版本信息的扩展属性
            project.extensions.create("releaseInfo", ReleaseInfoExt.class)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    app\build.gradle 下调用

    apply plugin: 'com.monk.customplugin'
    
    releaseInfo {
        versionName = "v0.1.0"
        versionCode = '1'
        versionInfo = '发布了~~'
        fileName = 'release.xml'
        
        // 可以接着去定义实现逻辑
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3. 自定义Task

    刚刚自定义 Extension,可以在相应的 extension 闭包下定义实现逻辑,但是我们也可以通过自定义 Task 的方式完成这部分的功能

    // groovy\com\monk\customplugin\ReleaseInfoTask.groovy
    class ReleaseInfoTask extends DefaultTask{
        ReleaseInfoTask(){
            group='version_manager'
            description = 'release info update'
        }
    
        @Override
        Task doFirst(Action<? super Task> action) {
            println 'doFirst'
            return super.doFirst(action)
        }
    
        @Override
        Task doLast(Action<? super Task> action) {
            println 'doLast'
            return super.doLast(action)
        }
        @TaskAction
        void doTask(){
             // 可以接着去定义实现逻辑
        }
        
     // groovy\com\monk\customplugin\CustomPlugins.groovy
    class CustomPlugins implements Plugin<Project> {
        @Override
        void apply(Project project) {
            println "Hello Plugins --buildSrc: ${project.name}"
    
            // 创建用于更新版本信息的 task
            project.tasks.create("releaseInfoTask", ReleaseInfoTask.class)
    
        }
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    但是经过验证,发现 buildSrc 下自定义 task 的方式,并未执行相关task,在app\build.gradle 下声明该 task 也会编译报错,所以还是再自定义 extension 中取定义实现逻辑吧

  • 相关阅读:
    ECharts数据可视化项目【6】
    海大校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著
    Python常见面试题
    C#MessageBox的使用
    点云直通滤波(附python open3d 代码)
    视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级
    【论文理解】Neural circuit policies enabling auditable autonomy
    八、mysql语句的DDL语句
    scanf输入时的小细节
    英特尔发布31.0.101.3430和31.0.101.2111新驱动
  • 原文地址:https://blog.csdn.net/qq_37776700/article/details/127544927