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…