美文网首页Android
Gradle plugin demo written with

Gradle plugin demo written with

作者: JaedenKil | 来源:发表于2020-10-13 19:25 被阅读0次
  1. Create an empty android project in android studio.
  2. Create a new module, in my case, I name it as gradleSetUpPlugin.
  3. Choose File - New - New Module - Android Library - Next, input name gradleSetUpPlugin, choose language as Java, click Finish.
  4. Remove useless folders in module gradleSetUpPlugin:
  • gradleSetUpPlugin - libs
  • gradleSetUpPlugin - src - androidTest
  • gradleSetUpPlugin - src - test
  • gradleSetUpPlugin - src - java
  • gradleSetUpPlugin - src - main - AndroidManifest.xml
  1. Update gradleSetUpPlugin - build.gradle file:
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}
  1. Create a new folder under gradleSetUpPlugin - src - main, name it groovy.
  2. Create package under gradleSetUpPlugin - src - main - groovy, as I tend to name the package name for my plugin as com.syna.jk, right click on groovy, New - Package, input desired package name 'com.syna.jk'
  3. Not sure why I cannot directly create a new groovy class, so I create a new Java class, right click on package com.syna.jk, New - Java Class, input text "HelloWorldPlugin"
  4. Right click on class file "HelloWorldPlugin", Refactor - Rename File, change "HelloWorldPlugin.java" to "HelloWorldPlugin.groovy", then click "Refactor".
  5. Now I got a groovy class:
package com.syna.jk;

class HelloWorldPlugin {
}
  1. Update details, implements Plugin<Project> and override method apply():
package com.syna.jk

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

class HelloWorldPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {

    }
}
  1. Add a new task inside the apply() method, for demo I create another groovy class to receive a string parameter:
package com.syna.jk

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

@SuppressWarnings("unused")
class HelloWorldPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println("This is apply() inside class HelloWorldPlugin")
        project.extensions.create('demoStrParam', ParamHolder)
        def str = project.demoStrParam.str
        println("Receive param as '${str}'")
        project.task('helloWorldDemo', {
            println("${str} from task 'helloWorldDemo' inside class 'HelloWorldPlugin'")
        })
    }
}

package com.syna.jk;

@SuppressWarnings("unused")
class ParamHolder {

    String str

}
  1. This step is important:

Define the plugin name:

  • Create a new folder under gradleSetUpPlugin - src - main, right click on main, input resources
  • Right click on resources, create folder, input META-INF
  • Right click on META-INF, create folder, input gradle-plugins
  • Create file, xxx.properties, here xxx will be used as plugin name, here I use com.syna.jk.gradleSetUpTasks.properties.
  • Inside the file, add a line of code:
implementation-class=com.syna.jk.HelloWorldPlugin
  1. Update gradleSetUpPlugin - buld.gradle
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'http://xxx/repository/GradleTaskPlugin/') {
                authentication(userName: 'yyy', password: 'zzz')
            }
            pom.project {
                //Make sure to update version and execute gradle task to upload lib to Nexus repo manager
                version '2.0.0_beta001'
                artifactId 'public-gradle-task'
                groupId 'com.syna.jk'
                description 'library'
            }
        }
    }
}
  1. Upload gradle plugin to maven repository, run gradle task uploadArchives inside module gradleSetUpPlugin
  2. Apply this gradle plugin in the target project:
  • In target project, project level build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        maven {url "http://sha2uvp-gog01.synaptics.com:8081/repository/GradleSetUpPlugin/"}
    }
    dependencies {
        //noinspection GradleDependency
        classpath 'com.android.tools.build:gradle:3.6.3'
        classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.6.0.0'
        //noinspection GradleDependency
        classpath 'com.syna.jk:public-gradle-task:1.0.9'
        classpath 'com.syna.jk:gradle-setUp-plugin:2.0.0_beta001'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {url "http:/xxx/repository/GradleSetUpPlugin/"}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • In target project, module app level build.gradle:
apply plugin: 'com.syna.jk.gradleSetUpTasks'
gradle.projectsEvaluated {
    connectedDebugAndroidTest.finalizedBy helloWorldDemo
}

demoStrParam {
    str = "Hello World"
}
  1. In target project, run command ./gradlew connectedDebugAndroidTest
> Task :app:helloWorldDemo
Receive param as 'Hello World'
Hello World from task 'helloWorldDemo' inside class 'HelloWorldPlugin'
  1. In target project, the config can be modified:
  • Modify the parameter
  • Modify the sequence of the executing gradle commands
gradle.projectsEvaluated {
    connectedDebugAndroidTest.dependsOn helloWorldDemo
}

demoStrParam {
    str = "Hello Groovy"
}

Now the gradle plugin can be successfully imported and applied.

相关文章

网友评论

    本文标题:Gradle plugin demo written with

    本文链接:https://www.haomeiwen.com/subject/iwzmpktx.html