У меня есть скрипт сборки 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
.
Есть идеи, как это исправить?
источник
timestamp()
илиcurrentWorkingDirectory()
методов какtask
-s (например). Служебные функции и подобные вещи номинально скалярны - они не были бы задачами, за исключением того, что есть ограничения на повторное использование кода, встроенные в Gradle и большинство систем сборки. Мне нравится СУХОЙ мир, где я могу сделать вещь ОДИН раз и использовать ее повторно. Фактически, расширяя пример @Pieter VDE, я также используюroot.gradle
шаблон " " для моего родительского проекта - файл build.gradle обычно определяет некоторые особенности проекта, а затем простоapply ${ROOT}
...Ответы:
Невозможно поделиться методами, но вы можете поделиться дополнительными свойствами, содержащими замыкание, что сводится к одному и тому же. Например, объявить
ext.foo = { ... }
incommon-methods.gradle
, используйтеapply from:
для применения сценария, а затем вызовите закрытие с помощьюfoo()
.источник
File foo(String f)
станетext.foo = { f -> ... }
, можно тогда просто сделать что-нибудь вродеFile f = 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.
источник
ext
.Используя dsl Kotlin, он работает так:
build.gradle.kts :
external.gradle.kts :
источник
Другой подход для Kotlin DSL может быть:
мой-plugin.gradle.kts
settings.gradle.kts
источник