Last active
February 7, 2020 06:47
-
-
Save wakwak3125/e7af0cefdfb25fa11cb48c0d9826bb81 to your computer and use it in GitHub Desktop.
Gradle plugin to create remote build task
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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