web-dev-qa-db-fra.com

Comment définir et appeler des méthodes personnalisées dans build.gradle

Dans le cadre de mon projet, je dois lire les fichiers d'un répertoire et effectuer certaines opérations, toutes dans le script de construction. L'opération est la même pour chaque fichier (lecture et exécution de requêtes SQL). Je pense que c'est une tâche répétitive et qu'il vaut mieux écrire à l'intérieur d'une méthode. Depuis que je suis nouveau, je ne sais pas comment cela devrait être. S'il vous plaît aider.

62
Tomin

Une approche donnée ci-dessous:

ext.myMethod = { param1, param2 ->
    // Method body here
}

Notez que cela est créé pour la portée du projet, c.-à-d. disponible globalement pour le projet, qui peut être appelé comme suit n'importe où dans le script de construction à l'aide de myMethod(p1, p2), ce qui équivaut à project.myMethod(p1, p2)

La méthode peut également être définie sous différentes portées, telles que dans les tâches:

task myTask {
    ext.myMethod = { param1, param2 ->
        // Method body here
    }

    doLast {
        myMethod(p1, p2) // This will resolve 'myMethod' defined in task
    }
}
84
Invisible Arrow

Si vous avez défini des méthodes dans un autre fichier, * .gradle - ext.method () le rend accessible à l’ensemble du projet. Par exemple, voici un

versioning.gradle

// ext makes method callable project wide
ext.getVersionName = { ->
    try {
        def branchout = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD'
            standardOutput = branchout
        }
        def branch = branchout.toString().trim()

        if (branch.equals("master")) {
            def stdout = new ByteArrayOutputStream()
            exec {
                commandLine 'git', 'describe', '--tags'
                standardOutput = stdout
            }
            return stdout.toString().trim()
        } else {
            return branch;
        }
    }
    catch (ignored) {
        return null;
    }
}

build.gradle

task showVersion << {
    // Use inherited method
    println 'VersionName: ' + getVersionName()
}

Sans le format ext.method (), la méthode ne sera disponible que dans le fichier * .gradle déclaré. C'est la même chose avec les propriétés.

23
Rowland Mtetezi

Vous pouvez définir des méthodes de la manière suivante:

// Define an extra property
ext.srcDirName = 'src/Java'

// Define a method
def getSrcDir(project) {
    return project.file(srcDirName)
}

Vous trouverez plus de détails dans la documentation Gradle Chapitre 62. Organiser la logique de compilation

22
Ivan Marinov

Un exemple avec un objet racine contenant des méthodes.

fichier hg.gradle:

ext.hg = [

    cloneOrPull: { source, dest, branch ->
        if (!dest.isDirectory())
            hg.clone(source, dest, branch)
        else
            hg.pull(dest)
        hg.update(dest, branch)
    },

    clone: { source, dest, branch ->
        dest.mkdirs()
        exec {
            commandLine 'hg', 'clone', '--noupdate', source, dest.absolutePath
        }
    },

    pull: { dest ->
        exec {
            workingDir dest.absolutePath
            commandLine 'hg', 'pull'
        }
    },

]

fichier build.gradle

apply from: 'hg.gradle'

hg.clone('path/to/repo')
10
Kevin Struillou