0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gradle Pluginを作成する

Posted at

pluginプロジェクトを作成

pluginプロジェクトを作成する の手順で作成する。

build.gradleのpluginsにmaven-publishを追加

plugin/build.gradle
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Gradle plugin project to get you started.
 * For more details take a look at the Writing Custom Plugins chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.5.1/userguide/custom_plugins.html
 */


plugins {
    // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins
    id 'java-gradle-plugin'

    // Apply the Groovy plugin to add support for Groovy
    id 'groovy'

    id 'maven-publish'
}

version = '1.0.0'

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use the awesome Spock testing and specification framework
    testImplementation 'org.spockframework:spock-core:2.1-groovy-3.0'
}

gradlePlugin {
    // Define the plugin
    plugins {
        greeting {
            id = 'plugin.project.greeting'
            implementationClass = 'plugin.project.PluginProjectPlugin'
        }
    }
}

// Add a source set for the functional test suite
sourceSets {
    functionalTest {
    }
}

configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation)

// Add a task to run the functional tests
tasks.register('functionalTest', Test) {
    testClassesDirs = sourceSets.functionalTest.output.classesDirs
    classpath = sourceSets.functionalTest.runtimeClasspath
    useJUnitPlatform()
}

gradlePlugin.testSourceSets(sourceSets.functionalTest)

tasks.named('check') {
    // Run the functional tests as part of `check`
    dependsOn(tasks.functionalTest)
}

tasks.named('test') {
    // Use JUnit Jupiter for unit tests.
    useJUnitPlatform()
}

ローカルにpublishする

% ./gradlew build
% ./gradlew publishToMavenLocal

BUILD SUCCESSFUL in 701ms
9 actionable tasks: 5 executed, 4 up-to-date
% cd ~/.m2/repository/plugin/project/greeting/
% tree .
.
└── plugin.project.greeting.gradle.plugin
    ├── 1.0.0
    │   └── plugin.project.greeting.gradle.plugin-1.0.0.pom
    └── maven-metadata-local.xml

2 directories, 2 files
plugin.project.greeting.gradle.plugin-unspecified.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>plugin.project.greeting</groupId>
  <artifactId>plugin.project.greeting.gradle.plugin</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <dependencies>
    <dependency>
      <groupId>plugin-project</groupId>
      <artifactId>plugin</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</project>

pluginを利用するプロジェクトを作成

% mkdir plugin-use-project
% cd plugin-use-project/
% gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] 
Project name (default: plugin-use-project): 

> Task :init
Get more help with your project: Learn more about Gradle by exploring our samples at https://docs.gradle.org/7.5.1/samples

BUILD SUCCESSFUL in 10s
2 actionable tasks: 2 executed

build.gradleを編集してPluginを読み込む

build.gradle
buildscript {
    repositories {
        mavenLocal() // <1>
    }
    dependencies {
        classpath 'plugin.project.greeting:plugin.project.greeting.gradle.plugin:1.0.0' // <2>
    }
}

apply plugin: 'plugin.project.greeting'

Pluginの実行

% ./gradlew greeting

> Task :greeting
Hello from plugin 'plugin.project.greeting'

BUILD SUCCESSFUL in 364ms
1 actionable task: 1 executed

パッケージ名を変える

% mv plugin greeting-plugin
settings.gradle
rootProject.name = 'plugin-project'
include('greeting-plugin')
greeting-plugin/build.gradle
plugins {
    // Apply the Java Gradle plugin development plugin to add support for developing Gradle plugins
    id 'java-gradle-plugin'

    // Apply the Groovy plugin to add support for Groovy
    id 'groovy'

    id 'maven-publish'
}

group = 'com.ykdevs.plugin'
version = '1.0.0'

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use the awesome Spock testing and specification framework
    testImplementation 'org.spockframework:spock-core:2.1-groovy-3.0'
}

gradlePlugin {
    // Define the plugin
    plugins {
        greeting {
            id = 'plugin.project.greeting'
            implementationClass = 'plugin.project.PluginProjectPlugin'
        }
    }
}

// Add a source set for the functional test suite
sourceSets {
    functionalTest {
    }
}

configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation)

// Add a task to run the functional tests
tasks.register('functionalTest', Test) {
    testClassesDirs = sourceSets.functionalTest.output.classesDirs
    classpath = sourceSets.functionalTest.runtimeClasspath
    useJUnitPlatform()
}

gradlePlugin.testSourceSets(sourceSets.functionalTest)

tasks.named('check') {
    // Run the functional tests as part of `check`
    dependsOn(tasks.functionalTest)
}

tasks.named('test') {
    // Use JUnit Jupiter for unit tests.
    useJUnitPlatform()
}
yuzuru[Andy]% ./gradlew build

BUILD SUCCESSFUL in 415ms
10 actionable tasks: 10 up-to-date
yuzuru[Andy]% ./gradlew publishToMavenLocal

BUILD SUCCESSFUL in 399ms
9 actionable tasks: 5 executed, 4 up-to-date
~/.m2/repository/com/ykdevs/plugin/greeting-plugin/1.0.0/greeting-plugin-1.0.0.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- This module was also published with a richer model, Gradle metadata,  -->
  <!-- which should be used instead. Do not delete the following line which  -->
  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
  <!-- that they should prefer consuming it instead. -->
  <!-- do_not_remove: published-with-gradle-metadata -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ykdevs.plugin</groupId>
  <artifactId>greeting-plugin</artifactId>
  <version>1.0.0</version>
</project>

呼び出し側のプロジェクトのbuild.gradleを編集

build.gradle
buildscript {
    repositories {
        mavenLocal() // <1>
    }
    dependencies {
        classpath 'com.ykdevs.plugin:greeting-plugin:1.0.0' // <2>
    }
}

apply plugin: 'plugin.project.greeting'

タスクを実行

% ./gradlew greeting

> Task :greeting
Hello from plugin 'plugin.project.greeting'

BUILD SUCCESSFUL in 497ms
1 actionable task: 1 executed
  • groupとversionを指定しておく
  • ディレクトリの1階層目がアーティファクト名になる

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?