Извлеките распространенные методы из 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!")
}