Я пытаюсь написать этот пользовательский плагин для Gradle, но я застрял в правильной передаче параметров плагину.
внутри плагина я создаю расширение, как показано ниже:
@Override void apply(final Project p) {
p.extensions.create('myPlugin', MyPluginData.class)
затем внутри MyPluginData
Я обрабатываю def propertyMissing(String name, value)
для получения ожидаемых параметров клиента.
И, наконец, внутри клиентского приложения build.gradle
Я пытаюсь настроить данные:
println("From root value is " + SOME_VALUE)
myPlugin {
println("From plugin value is " + SOME_VALUE)
println("But from plugin 'findProperty' value is " + findProperty("SOME_VALUE"))
clientDataSet = {
data_1 = SOME_VALUE
data_2 = findProperty("SOME_VALUE")
data_3 = "this is a string"
SOME_VALUE определено в моем проекте gradle.properties
, и я получил следующий журнал во время сборки:
Из корневого значения - правильное значение из свойств
Из плагина - значениеnull
Но из плагина 'findProperty' значение является правильным значением из свойств
, и, конечно, при получении data_1
SOME_VALUE равно нулю, data_2
имеют правильное значение, а данные 3жестко закодированная строка, которую я передал.
Мой вопрос:
Что я делаю неправильно или какая конфигурация отсутствует в моем плагине, чтобы клиентское приложение могло напрямую ссылаться на свойствоиз их gradle.properties
файлов?
Редактировать: согласно запросу в комментариях
MyPluginData
просто extends HashMap<String, MyPluginDataSet>
и MyPluginDataSet
простонесколько строк.
Итак, внутри propertyMissing
Я просто добавляю имя свойства на карту и создаю MyPluginDataSet
со строками (что позже используется для генерации пользовательских задач).
Функция отсутствующего свойства:
def propertyMissing(String name, value) {
// Create the new data set and add to the map
def data = new MyPluginDataSet()
put(name, data)
// setup and execute the client closure to configure the data
def closure = value as Closure
closure.delegate = data
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure.run()
}