Solución:
Debería considerar pasar el argumento -P al invocar Gradle.
De la documentación de Gradle:
–project-prop Establece una propiedad de proyecto del proyecto raíz, por ejemplo -Pmyprop = myvalue. Consulte la Sección 14.2, “Propiedades de Gradle y propiedades del sistema”.
Teniendo en cuenta esta build.gradle
task printProp << {
println customProp
}
Invocando Gradle -PcustomProp=myProp
dará esta salida:
$ gradle -PcustomProp=myProp printProp
:printProp
myProp
BUILD SUCCESSFUL
Total time: 3.722 secs
Esta es la forma que encontré para pasar parámetros.
Si la tarea a la que desea pasar parámetros es de tipo JavaExec
y está utilizando Gradle 5, por ejemplo, el complemento de la aplicación run
tarea, entonces puede pasar sus parámetros a través de la --args=...
opción de línea de comando. Por ejemplo gradle run --args="foo --bar=true"
.
De lo contrario, no hay una forma incorporada conveniente de hacer esto, pero hay 3 soluciones.
1. Si hay pocos valores, función de creación de tareas
Si los valores posibles son pocos y se conocen de antemano, puede crear mediante programación una tarea para cada uno de ellos:
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);
}
Luego, llamaría a sus tareas de la siguiente manera:
./gradlew myTask_macosx
2. Truco de entrada estándar
Un truco conveniente es pasar los argumentos a través de la entrada estándar y hacer que se lea su tarea:
./gradlew myTask <<<"arg1 arg2 arg in several parts"
con el código a continuación:
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
}
}
También deberá agregar las siguientes líneas en la parte superior de su script de compilación:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
3. -P parámetros
La última opción es pasar un -P
parámetro a Gradle:
./gradlew myTask -PmyArg=hello
A continuación, puede acceder a él como myArg
en su script de compilación:
task myTask {
doFirst {
println myArg
... do what you want
}
}
Crédito a @ 789 por su respuesta sobre la división de argumentos en tokens.
Sugeriría el método presentado en el foro de 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
}
}
Yo mismo he utilizado este método para crear tareas personalizadas y funciona muy bien.