Извлечение общих методов из сценария сборки 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.
есть идеи, как это исправить?
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