Gradle Plugin

Alguém já teve a oportunidade de criar algum plugin do gradle para encapsular outros plugins? A ideia seria para compartilhar as mesmas configurações de builds entre projetos semelhante ao que o pom parent do maven faz, porém para o gradle.

Estive lendo a documentação oficial e vendo alguns plugins existentes, mas rapaz, é muita coisa e parece tudo um pouco confuso.

Vlw!

Fui pesquisar aqui e descobri umas coisas interessantes, não sei se cobre sua necessidade, mas veja o que eu consegui:

O app

Eu tenho este código fonte:

import org.apache.commons.text.WordUtils;

public class App {
  public static String getGreeting() {
    return WordUtils.capitalizeFully("aaa bbb ccc");
  }

  public static void main(String... args) {
    System.out.println(getGreeting());
  }
}

Este teste JUnit:

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

class AppTest {
  @Test
  void shouldCapitalizeAllWords() {
    assertEquals("Aaa Bbb Ccc", App.getGreeting());
  }
}

e este build.gradle:

plugins {
  // id 'greeting-java' version '0.1'
  id 'greeting-groovy' version '0.1'
}

application {
  mainClass = 'App'
}

sourceSets {
  main.java.srcDirs = ['src']
  test.java.srcDirs = ['test']
}

Como vc pode ver, meu código depende da Apache Commons e da JUnit, mas no build.gradle eu não adiciono nenhuma das 2, fora que normalmente a gente acrescentaria o plugin ‘application’, mas eu adicionei apenas o meu próprio plugin. Eu fiz o mesmo plugin em Java e Groovy, por isso eu deixei comentado ali.

O plugin Java

Meu src/GreetingPlugin.java:

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.tasks.testing.Test;

public class GreetingPlugin implements Plugin<Project> {
  public void apply(Project project) {
    project.getPluginManager().apply(org.gradle.api.plugins.ApplicationPlugin.class);

    project.getRepositories().mavenCentral();

    project.getDependencies().add("testImplementation", "org.junit.jupiter:junit-jupiter:5.7.2");
    project.getDependencies().add("implementation", "org.apache.commons:commons-text:1.9");

    project.getTasks().named("test", Test.class, (action) -> action.useJUnitPlatform());

    project.task("hello", (action) -> {
      System.out.println("Hello from Java");
    });
  }
}

O build.gradle:

plugins {
  id 'java-gradle-plugin'
  id 'maven-publish'
}

group = 'greeting-java'
version = '0.1'

sourceSets {
  main.java.srcDirs = ['src']
}

gradlePlugin {
  plugins {
    greetingsPlugin {
      id = 'greeting-java'
      implementationClass = 'GreetingPlugin'
    }
  }
}

O plugin Groovy

É o mesmo do Java, fiz só para comparação, este é o src/GreetingPlugin.groovy:

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

class GreetingPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.configure(project) {
      apply plugin: 'application'

      repositories {
        mavenCentral()
      }

      dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
        implementation 'org.apache.commons:commons-text:1.9'
      }

      tasks.named('test') {
        useJUnitPlatform()
      }

      project.task('hello') {
        println 'Hello from Groovy'
      }
    }
  }
}

O build.gradle (a diferença aqui é que no Java usa-se o plugin ‘java-gradle-plugin’ e aqui é o ‘groovy-gradle-plugin’):

plugins {
  id 'groovy-gradle-plugin'
  id 'maven-publish'
}

group = 'greeting-groovy'
version = '0.1'

sourceSets {
  main.groovy.srcDirs = ['src']
}

gradlePlugin {
  plugins {
    greetingsPlugin {
      id = 'greeting-groovy'
      implementationClass = 'GreetingPlugin'
    }
  }
}

Na prática

Eu usei o plugin ‘maven-publish’ para publicar o meu plugin. Como eu não quis colocar online, eu usei o seguinte comando para publica apenas no meu repositório local que fica, por padrão, em ~/.m2.

gradle clean build publishToMavenLocal

Como o plugin está só no local, eu tive que adicionar no meu app um arquivo settings.gradle com o conteúdo abaixo para ele poder localizar corretamente, mas se vc publicar online, eu acho que não precisaria disso:

pluginManagement {
  repositories {
    mavenLocal()
  }
}

Eu fiz um projetinho aqui para vc experimentar: testes-com-plugins-do-gradle.zip (4,6,KB)

1 curtida