Skip to content

Instantly share code, notes, and snippets.

@wakwak3125
Last active February 7, 2020 06:47
Show Gist options
  • Save wakwak3125/e7af0cefdfb25fa11cb48c0d9826bb81 to your computer and use it in GitHub Desktop.
Save wakwak3125/e7af0cefdfb25fa11cb48c0d9826bb81 to your computer and use it in GitHub Desktop.
Gradle plugin to create remote build task
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Exec
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.get
import java.util.Locale
private const val EXTENSION_NAME = "mainframer"
private const val DEFAULT_SCRIPT_NAME = "mainframer"
private typealias Extension = MainframerPluginExtension
@ExperimentalStdlibApi
class MainframerPlugin : Plugin<Project> {
private val excludesTaskNameEnds = listOf(
"Classes",
"Resources",
"PreBundle"
)
override fun apply(target: Project) {
target.extensions.create(EXTENSION_NAME, Extension::class.java)
target.afterEvaluate {
val extension = target.extensions[EXTENSION_NAME] as Extension
tasks.map { it.name }
.filter { shouldCreateRemoteTask(it, extension) }
.forEach { target.run { createTask(it, extension) } }
}
}
private fun Project.createTask(taskName: String, extension: Extension) {
val taskToCreate = "remote${taskName.capitalize(Locale.ROOT)}"
tasks.create<Exec>(taskToCreate) {
workingDir = rootProject.projectDir
commandLine("./${extension.scriptFileName}", "./gradlew", taskName)
}
}
private fun shouldCreateRemoteTask(taskName: String, extension: Extension): Boolean =
when {
excludesTaskNameEnds.map { taskName.endsWith(it) }.contains(true) -> false
taskName.startsWith("assemble") -> extension.enableAssemble
taskName.startsWith("build") -> extension.enableBuild
taskName.startsWith("bundle") -> extension.enableBundle
taskName.startsWith("test") -> extension.enableTest
taskName.startsWith("lint") -> extension.enableLint
else -> false
}
}
open class MainframerPluginExtension(
var scriptFileName: String = DEFAULT_SCRIPT_NAME,
var enableAssemble: Boolean = true,
var enableBuild: Boolean = true,
var enableBundle: Boolean = true,
var enableTest: Boolean = true,
var enableLint: Boolean = true
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment