Извлеките распространенные методы из Gradle build script
У меня есть Gradle build script (build.gradle
), в котором я создал некоторые задачи. Эти задачи состоят в основном из вызовов методов. Вызываемые методы также находятся в сборке script.
Теперь, вот ситуация:
Я создаю большое количество скриптов сборки, которые содержат разные задачи, но используют те же методы из исходного script. Таким образом, я хотел бы каким-то образом извлечь эти "общие методы", поэтому я могу легко использовать их вместо копирования для каждого нового script, который я создаю.
Если Gradle были PHP, то было бы идеально:
//script content
...
require("common-methods.gradle");
...
//more script content
Но, конечно, это невозможно. Или это?
В любом случае, как я могу достичь этого результата? Каков наилучший способ сделать это? Я уже прочитал документацию Gradle, но я не могу определить, какой метод будет самым простым и наиболее подходящим для этого.
Спасибо заранее!
UPDATE:
Мне удалось извлечь методы в другом файле
(используя apply from: 'common-methods.gradle'
),
поэтому структура выглядит следующим образом:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
После выполнения задачи из build.gradle
я столкнулся с новой проблемой: по-видимому, методы не распознаются, когда они находятся в common-methods.gradle
.
Любые идеи о том, как это исправить?
Ответы
Ответ 1
Нельзя обмениваться методами, но вы можете делиться дополнительными свойствами, содержащими закрытие, которое сводится к одному и тому же. Например, объявите ext.foo = { ... }
в common-methods.gradle
, используйте apply from:
для применения script, а затем вызовите замыкание с помощью foo()
.
Ответ 2
Опираясь на ответ питера, я экспортирую свои методы следующим образом:
Содержание helpers/common-methods.gradle
:
// Define methods as usual
def commonMethod1(param) {
return true
}
def commonMethod2(param) {
return true
}
// Export methods by turning them into closures
ext {
commonMethod1 = this.&commonMethod1
otherNameForMethod2 = this.&commonMethod2
}
И вот как я использую эти методы в другом скрипте:
// Use double-quotes, otherwise $ won't work
apply from: "$rootDir/helpers/common-methods.gradle"
// You can also use URLs
//apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle"
task myBuildTask {
def myVar = commonMethod1("parameter1")
otherNameForMethod2(myVar)
}
Здесь больше о преобразовании методов в замыкания в Groovy.
Ответ 3
Используя Kotlin dsl, он работает следующим образом:
build.gradle.kts:
apply {
from("external.gradle.kts")
}
val foo = extra["foo"] as () -> Unit
foo()
external.gradle.kts:
extra["foo"] = fun() {
println("Hello world!")
}