J'ai un script de construction gradle dans lequel j'essaie d'inclure le plugin css d'Eric Wendelin - http://eriwen.github.io/gradle-css-plugin/
Son assez facile à implémenter, et parce que je veux seulement la minification (plutôt que de combiner et de compresser), j'ai les parties pertinentes du script de construction qui ressemblent à ceci:
minifyCss {
source = "src/main/webapp/css/brandA/styles.css"
dest = "${buildDir}/brandA/styles.css"
yuicompressor {
lineBreakPos = -1
}
}
war {
baseName = 'ex-ren'
}
war.doFirst {
tasks.myTask.minifyCss.execute()
}
C'est parfait - lorsque j'exécute la tâche gradle war, il appelle la tâche minifyCss, prend le fichier css source et crée une version minifiée dans le buildDir
Cependant, j'ai une poignée de fichiers css qui nécessitent une minification, mais ne se combinent pas en un seul fichier (donc je n'utilise pas la tâche combineCss)
Ce que j'aimerais pouvoir faire, c'est faire les propriétés source et dest (en supposant que c'est la bonne terminologie?) Des variables de référence de tâche minifyCss d'une certaine sorte - soit des variables passées dans la tâche dans la signature, soit des variables globales, ou quelque chose ...
Quelque chose comme ça, je suppose (qui ne fonctionne pas):
minifyCss(sourceFile, destFile) {
source = sourceFile
dest = destFile
yuicompressor {
lineBreakPos = -1
}
}
war {
baseName = 'ex-ren'
}
war.doFirst {
tasks.myTask.minifyCss.execute("src/main/webapp/css/brandA/styles.css", "${buildDir}/brandA/styles.css")
tasks.myTask.minifyCss.execute("src/main/webapp/css/brandB/styles.css", "${buildDir}/brandB/styles.css")
tasks.myTask.minifyCss.execute("src/main/webapp/css/brandC/styles.css", "${buildDir}/brandC/styles.css")
}
Cela ne fonctionne pas non plus:
def sourceFile = null
def destFile = null
minifyCss {
source = sourceFile
dest = destFile
yuicompressor {
lineBreakPos = -1
}
}
war {
baseName = 'ex-ren'
}
war.doFirst {
sourceFile = "src/main/webapp/css/brandA/styles.css"
destFile = "${buildDir}/brandA/styles.css"
tasks.myTask.minifyCss.execute()
}
Pour ma vie, je ne peux pas trouver comment appeler une tâche et transmettre des variables dans :(
Toute aide sera grandement appréciée;
Je pense que vous voulez probablement voir la minification de chaque ensemble de CSS comme une tâche distincte
task minifyBrandACss(type: com.eriwen.gradle.css.tasks.MinifyCssTask) {
source = "src/main/webapp/css/brandA/styles.css"
dest = "${buildDir}/brandA/styles.css"
}
etc etc
BTW exécuter vos tâches de minification dans une action de la tâche de guerre me semble étrange - ne serait-il pas plus logique d'en faire une dépendance de la tâche de guerre?
Vous devriez envisager de passer l'argument -P en appelant Gradle.
De Documentation Gradle :
--project-prop Définit une propriété de projet du projet racine, par exemple -Pmyprop = myvalue. Voir Section 14.2, "Propriétés Gradle et propriétés système".
Compte tenu de ce build.gradle
task printProp << {
println customProp
}
Appel de Gradle -PcustomProp=myProp
donnera cette sortie:
$ gradle -PcustomProp=myProp printProp
:printProp
myProp
BUILD SUCCESSFUL
Total time: 3.722 secs
C'est ainsi que j'ai trouvé à passer des paramètres.
Si la tâche à laquelle vous souhaitez transmettre des paramètres est de type JavaExec
et que vous utilisez Gradle 5, par exemple la tâche run
du plug-in d'application, alors vous pouvez passer vos paramètres via le --args=...
option de ligne de commande . Par exemple gradle run --args="foo --bar=true"
.
Sinon, il n'y a pas de méthode intégrée pratique pour le faire, mais il existe 3 solutions.
Si les valeurs possibles sont peu nombreuses et connues à l'avance, vous pouvez créer par programme une tâche pour chacune d'entre elles:
void createTask(String platform) {
String taskName = "myTask_" + platform;
task (taskName) {
... do what you want
}
}
String[] platforms = ["macosx", "linux32", "linux64"];
for(String platform : platforms) {
createTask(platform);
}
Vous appelleriez alors vos tâches de la manière suivante:
./gradlew myTask_macosx
Un hack pratique consiste à passer les arguments via une entrée standard et à lire votre tâche:
./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"
avec le code ci-dessous:
String[] splitIntoTokens(String commandLine) {
String regex = "(([\"']).*?\\2|(?:[^\\\\ ]+\\\\\\s+)+[^\\\\ ]+|\\S+)";
Matcher matcher = Pattern.compile(regex).matcher(commandLine);
ArrayList<String> result = new ArrayList<>();
while (matcher.find()) {
result.add(matcher.group());
}
return result.toArray();
}
task taskName, {
doFirst {
String typed = new Scanner(System.in).nextLine();
String[] parsed = splitIntoTokens(typed);
println ("Arguments received: " + parsed.join(" "))
... do what you want
}
}
Vous devrez également ajouter les lignes suivantes en haut de votre script de génération:
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;
import Java.util.Scanner;
La dernière option consiste à passer un -P
paramètre à Gradle:
./gradlew myTask -PmyArg=hello
Vous pouvez ensuite y accéder en tant que myArg
dans votre script de génération:
task myTask {
doFirst {
println myArg
... do what you want
}
}
Crédit à @ 789 pour sa réponse sur la division des arguments en jetons
task mathOnProperties << {
println Integer.parseInt(a)+Integer.parseInt(b)
println new Integer(a) * new Integer(b)
}
$ gradle -Pa=3 -Pb=4 mathOnProperties
:mathOnProperties
7
12
BUILD SUCCESSFUL
Je suggérerais la méthode présentée sur le forum Gradle :
def createMinifyCssTask(def brand, def sourceFile, def destFile) {
return tasks.create("minify${brand}Css", com.eriwen.gradle.css.tasks.MinifyCssTask) {
source = sourceFile
dest = destFile
}
}
J'ai moi-même utilisé cette méthode pour créer des tâches personnalisées, et cela fonctionne très bien.