Buscar..


Plugin simple de Gradle de `buildSrc`

Ejemplo simple de cómo crear un complemento personalizado y DSL para su proyecto de Gradle.
Esta muestra utiliza una de las tres formas posibles de crear complementos.
Las tres formas son:

  • en línea
  • buildSrc
  • complementos independientes

Este ejemplo muestra la creación de un complemento desde la carpeta buildSrc .

Esta muestra creará cinco archivos.

// project's build.gradle
build.gradle
// build.gradle to build the `buildSrc` module
buildSrc/build.gradle
// file name will be the plugin name used in the `apply plugin: $name`
// where name would be `sample` in this example
buildSrc/src/main/resources/META-INF/gradle-plugins/sample.properties
// our DSL (Domain Specific Language) model
buildSrc/src/main/groovy/so/docs/gradle/plugin/SampleModel.groovy
// our actual plugin that will read the values from the DSL
buildSrc/src/main/groovy/so/docs/gradle/plugin/SamplePlugin.groovy

build.gradle:

group 'so.docs.gradle'
version '1.0-SNAPSHOT'

apply plugin: 'groovy'
// apply our plugin... calls SamplePlugin#apply(Project)
apply plugin: 'sample'

repositories {
    mavenCentral()
}

dependencies {
    compile localGroovy()
}

// caller populates the extension model applied above
sample {
    product = 'abc'
    customer = 'zyx'
}

// dummy task to limit console output for example
task doNothing <<{}

buildSrc / build.gradle

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile localGroovy()
}

buildSrc / src / main / groovy / so / docs / gradle / plugin / SamplePlugin.groovy

package so.docs.gradle.plugin

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

class SamplePlugin implements Plugin<Project> {
    @Override
    void apply(Project target) {
        // create our extension on the project for our model
        target.extensions.create('sample', SampleModel)
        // once the script has been evaluated the values are available
        target.afterEvaluate {
            // here we can do whatever we need to with our values
            println "populated model: $target.extensions.sample"
        }
    }
}

buildSrc / src / main / groovy / so / docs / gradle / plugin / SampleModel.groovy:

package so.docs.gradle.plugin

// define our DSL model
class SampleModel {
    public String product;
    public String customer;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("SampleModel{");
        sb.append("product='").append(product).append('\'');
        sb.append(", customer='").append(customer).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

buildSrc / src / main / resources / META-INF / gradle-plugins / sample.properties

implementation-class=so.docs.gradle.plugin.SamplePlugin

Usando esta configuración podemos ver los valores proporcionados por la persona que llama en su bloque DSL

 $ ./gradlew -q doNothing
SampleModel{product='abc', customer='zyx'}

Cómo escribir un plugin independiente

Para crear un complemento Gradle independiente personalizado utilizando java (también puede usar Groovy), debe crear una estructura como esta:

plugin
|-- build.gradle
|-- settings.gradle
|-- src
    |-- main
    |   |-- java
    |   |-- resources
    |       |-- META-INF
    |           |-- gradle-plugins
    |-- test

Configurar la configuración de Gradle

En el archivo build.gradle usted define su proyecto.

apply plugin: 'java'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
} 

El complemento java se utilizará para escribir código java.
La dependencia gradleApi() nos dará todos los métodos y propiedades necesarios para crear un complemento de Gradle.

En el archivo settings.gradle :

rootProject.name = 'myplugin' 

Definirá la identificación del artefacto en Maven.
Si el archivo settings.gradle no está presente en el directorio del complemento, el valor predeterminado será el nombre del directorio.

Crear el plugin

Defina una clase en el src/main/java/org/sample/MyPlugin.java implementando la interfaz del Plugin .

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

public class MyPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
         project.getTasks().create("myTask", MyTask.class);
    }

} 

Defina la tarea extendiendo la clase DefaultTask :

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

public class MyTask extends DefaultTask {

    @TaskAction
    public void myTask() {
        System.out.println("Hello World");
    }
}

Declaración de clase de plugin

En la carpeta META-INF/gradle-plugins , debe crear un archivo de propiedades que defina la propiedad de implementation-class que identifica la clase de implementación de complemento.

En el META-INF/gradle-plugins/testplugin.properties

implementation-class=org.sample.MyPlugin.java

Observe que el nombre de archivo de las propiedades coincide con el ID del complemento .

Cómo construirlo y publicarlo.

Cambie el archivo build.gradle agregando información para cargar el complemento en un repositorio de Maven:

apply plugin: 'java'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
}

repositories {
    jcenter()
}


group = 'org.sample'
version = '1.0'

uploadArchives {
    repositories {
        mavenDeployer {
        repository(url: mavenLocal().url)
        }
    }
} 

Puede compilar y publicar el complemento de Gradle en el repositorio de Maven definido en el archivo plugin/build.gradle usando el siguiente comando.

$ ./gradlew clean uploadArchives 

Cómo usarlo

Para usar el complemento, agregue en el build.gradle de su proyecto:

buildscript {
     repositories {
         mavenLocal()
     }
 dependencies {
    classpath group: 'org.sample',    // Defined in the build.gradle of the plugin
              name: 'myplugin',       // Defined by the rootProject.name 
              version: '1.0'
    }
 }

apply plugin: 'testplugin'            // Defined by the properties filename

Luego puedes llamar a la tarea usando:

 $ ./gradlew myTask


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow