Open16
Gradle Plugin

buildSrcを使ってカスタムビルドを作成できた

buildSrcディレクトリを作成
buildSrc内に
plugins {
`kotlin-dsl`
}
repositories {
// The org.jetbrains.kotlin.jvm plugin requires a repository
// where to download the Kotlin compiler dependencies from.
mavenCentral()
}

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() {
}
}

アプリモジュールの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"))
}

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")
}
}

buildSrcの `build.gradle‘に
plugins {
...
`java-gradle-plugin`
}
gradlePlugin {
plugins {
create("simplePlugin") {
id = "org.gradle.sample.simple-plugin"
implementationClass = "com.github.goutarouh.gradlepluginsample.buildsrc.BundleReleaseFilesPlugin"
}
}
}

gradle pluginを使用したいモジュールで以下を追加
定義した時点でapplyメソッドが呼ばれる
plugins {
...
id("org.gradle.sample.simple-plugin")
}

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
}

Pluginのapplyメソッド内で以下を定義
bundleReleaseFiles
が、プラグインをapplyしたモジュール(appmodule)などから使用することができる
val extension = target.extensions.create(
"bundleReleaseFiles",
BundleReleaseFilesPluginsExtension::class.java
)

利用側のappModuleの build.gradle
はこんな感じ
plugins {
id("org.gradle.sample.simple-plugin")
}
bundleReleaseFiles {
appVersion.set("1.00.00")
outputDirectory.set(File(".", "build/outputs"))
}

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)
}
}
}

gradle tasks
を実行すると
My_plugin tasks
---------------
bundleReleaseFiles - Bundle release files

buildタイム向上
org.gradle.parallel=true
org.gradle.daemon=true