Извлечение общих методов из сценария сборки Gradle



у меня есть скрипт сборки Gradle (build.gradle), в котором я создал некоторые задачи. Эти задачи состоят в основном из вызовов методов. Вызываемые методы также находятся в скрипте сборки.



теперь, вот ситуация:



Я создаю достаточное количество сценариев сборки, которые содержат разные задачи, но используют одни и те же методы из исходного сценария. Таким образом, я хотел бы извлечь эти "общие методы" каким-то образом, поэтому я могу легко повторно использовать их вместо копирования их для каждого новый скрипт я создаю.



если бы Gradle был PHP, что-то вроде следующего было бы идеально:



//script content
...
require("common-methods.gradle");
...
//more script content


но конечно, это невозможно. Или это так?



в любом случае, как я могу достичь этого результата? Каков наилучший способ сделать это? Я уже прочитал документацию Gradle, но я не могу определить, какой метод будет самым простым и лучше всего подходит для этого.



спасибо вперед!





обновление:



мне удалось извлечь методы в другой файл



(через 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.



есть идеи, как это исправить?

646   3  

3 ответов:

невозможно поделиться методами, но вы можете поделиться дополнительными свойствами, содержащими закрытие, которое сводится к одному и тому же. Например, объявить ext.foo = { ... } на common-methods.gradle используйте apply from: применить скрипт, а затем вызвать закрытие с foo().

дом на ответ Питера, вот как я экспортирую свои методы:

контент 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: ссылке

С помощью Котлин ДСЛ работает это так:

построить.градля.КТС:

apply {
  from("external.gradle.kts")
}

val foo = extra["foo"] as () -> Unit
foo()

внешний.градля.КТС:

extra["foo"] = fun() {
  println("Hello world!")
}

Comments

    Ничего не найдено.