Подтвердить что ты не робот

Как определить и вызвать пользовательские методы в build.gradle

Как часть моего проекта, мне нужно прочитать файлы из каталога и выполнить все операции в сборке script. Для каждого файла операция одинакова (чтение некоторых sql-запросов и их выполнение). Я думаю, что это повторяющаяся задача и лучше писать внутри метода. Поскольку я новичок в gradle, я не знаю, как это должно быть. Пожалуйста, помогите.

4b9b3361

Ответ 1

Один из подходов, приведенный ниже:

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

Обратите внимание, что это создается для области проекта, т.е. глобально доступный для проекта, который можно вызвать в любом месте сборки script, используя myMethod(p1, p2), что эквивалентно project.myMethod(p1, p2)

Метод может быть определен и в разных областях, например, в задачах:

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

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

Ответ 2

Если вы определили какие-либо методы в любом другом файле *.gradle - ext.method() делает его доступным для всего проекта. Например, здесь

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()
}

Без формата ext.method() метод будет доступен только в файле *.gradle, который будет объявлен. То же самое со свойствами.

Ответ 3

Вы можете определить методы следующим образом:

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

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

Подробнее вы можете найти в gradle документации Глава 62. Организация логики сборки

Ответ 4

Пример с корневым объектом, содержащим методы.

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'
        }
    },

]

build.gradle file

apply from: 'hg.gradle'

hg.clone('path/to/repo')