A gradle task-ok nem tudnak paramétereket fogadni by design. Globális build paramétereket lehet olvasni belőlük, de hát azért a gányolásnak is van határa…
És bár paramétert nem lehet task-nak adni, task-ot viszonylag egyszerűen lehet létrehozni. És igény esetén kicsit bonyolultabban is.
Tegyük fel angular-t szeretnénk fordítani, különböző build target-ekkel. Vagy másolunk sokat, vagy csinálunk egy ilyet:
def createAngularTask(build, language) {
return tasks.create("buildAngular_${build}_${language}", Exec) {
group = "generated"
workingDir = project.ANGULAR_APP_PATH
inputs.dir(Paths.get(workingDir.toString(), "/src"))
outputs.dir(Paths.get(workingDir.toString(), "/dist_hu"))
def cmdArray = ["npm", "run", "${build}:${language}"]
if (System.getProperty('os.name').toUpperCase().contains('WINDOWS')) {
cmdArray.addAll(0, ["cmd", "/c"])
}
commandLine cmdArray
}
}
Kicsit emlékeztet ez a C-s define varázslásokra, de úgy tűnik a groovy-s csapatot ez nem rettentette el. Szóval ha csináltunk egy ilyet, akkor már csinálhatunk ilyesmiket is:
createAngularTask("aembuild", "hu")
createAngularTask("aembuild", "en")
createAngularTask("jarbuild", "hu")
createAngularTask("jarbuild", "en")
És ha ilyeneket csináltunk, akkor már csinálhatunk csoportos build task-okat copy paste nélkül:
task buildAngularAem {
group = BasePlugin.BUILD_GROUP
dependsOn('buildAngular_aembuild_hu')
dependsOn('buildAngular_aembuild_en')
}
A fenti játékot el lehet játszani akár string tömbökből is, ha nagyon sok task lenne. Így a task-oknak, csak a képzeletünk szab határt…