Open16

Gradle Plugin

gottiegottie
gottiegottie

buildSrcディレクトリを作成

buildSrc内に

plugins {
    `kotlin-dsl`
}

repositories {
    // The org.jetbrains.kotlin.jvm plugin requires a repository
    // where to download the Kotlin compiler dependencies from.
    mavenCentral()
}
gottiegottie

buildSrc内に

package com.github.goutarouh.gradlepluginsample.buildsrc

import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction

abstract class BundleReleaseFilesTask: DefaultTask() {

    @get:InputDirectory
    abstract val rootProject: DirectoryProperty

    @get:Input
    abstract val appVersion: Property<String>

    @get:OutputDirectory
    abstract val outputDirectory: DirectoryProperty

    @TaskAction
    fun run() {

    }
}
gottiegottie

アプリモジュールのbuild.gradleに以下を追加

importが必要です。

import com.github.goutarouh.gradlepluginsample.buildsrc.BundleReleaseFilesTask

tasks.register<BundleReleaseFilesTask>("bundleReleaseFiles") {
    rootProject.set(File("."))
    appVersion.set("1.00.00")
    outputDirectory.set(File("build/outputs"))
}

gottiegottie

PluginFileを拡張する

buildSrcのsrc/main/kotlin以下に

package com.github.goutarouh.gradlepluginsample.buildsrc

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

class BundleReleaseFilesPlugin: Plugin<Project> {
    override fun apply(target: Project) {
        println("hello gota")
    }
}
gottiegottie

buildSrcの `build.gradle‘に

plugins { 
    ...
    `java-gradle-plugin`
}

gradlePlugin {
    plugins {
        create("simplePlugin") {
            id = "org.gradle.sample.simple-plugin"
            implementationClass = "com.github.goutarouh.gradlepluginsample.buildsrc.BundleReleaseFilesPlugin"
        }
    }
}
gottiegottie

gradle pluginを使用したいモジュールで以下を追加

定義した時点でapplyメソッドが呼ばれる

plugins {
    ...
    id("org.gradle.sample.simple-plugin")
}
gottiegottie

Extensionを使用する

package com.github.goutarouh.gradlepluginsample.buildsrc

import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property

interface BundleReleaseFilesPluginsExtension {
    val appVersion: Property<String>
    val outputDirectory: DirectoryProperty
}
gottiegottie

Pluginのapplyメソッド内で以下を定義

bundleReleaseFilesが、プラグインをapplyしたモジュール(appmodule)などから使用することができる

val extension = target.extensions.create(
    "bundleReleaseFiles",
    BundleReleaseFilesPluginsExtension::class.java
)
gottiegottie

利用側のappModuleの build.gradleはこんな感じ

plugins {
    id("org.gradle.sample.simple-plugin")
}

bundleReleaseFiles {
    appVersion.set("1.00.00")
    outputDirectory.set(File(".", "build/outputs"))
}

gottiegottie

pluginのてタスクを定義追加する

extensionで受け取った値をもらって、Taskにセットする

class BundleReleaseFilesPlugin: Plugin<Project> {
    override fun apply(target: Project) {
        val extension = target.extensions.create(
            "bundleReleaseFiles",
            BundleReleaseFilesPluginsExtension::class.java
        )

        val bundleReleaseFiles = target.tasks.register(
            "bundleReleaseFiles",
            BundleReleaseFilesTask::class.java
        ) {
            this.group = "my_plugin"
            this.description = "Bundle release files"
        }

        bundleReleaseFiles.configure {
            appVersion.set(extension.appVersion)
            rootProject.set(target.projectDir)
            outputDirectory.set(extension.outputDirectory)
        }
    }
}
gottiegottie

gradle tasksを実行すると

My_plugin tasks
---------------
bundleReleaseFiles - Bundle release files
gottiegottie

buildタイム向上

org.gradle.parallel=true
org.gradle.daemon=true