Saltar al contenido

Cómo pasar parámetros o argumentos a una tarea de Gradle

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *