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