Свойства Gradle не видны внутри крышки контейнера - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь написать этот пользовательский плагин для 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()
}

1 Ответ

0 голосов
/ 25 сентября 2018

Делая MyPluginData наследованным от Map<>, я думаю, что вы как-то «нарушаете» процесс разрешения свойств (см. ExtensionAware ), и Gradle не будет пытаться искать свойство «SOME_VALUE» в другомобласти (поэтому он не найдет это свойство из расширения свойств gradle)

Может быть, вы можете попытаться упростить свой класс MyPluginData, сохранив внутреннюю карту вместо наследования от Map?что-то вроде этого:

class MyPluginData {
    Map<String, MyPluginDataSet> internalMap = new HashMap<>()

    def propertyMissing(String name, value) {
        println "Entering propertyMissing for name = $name"
        // Create the new data set and add to the map
        def data = new MyPluginDataSet()
        internalMap.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()
    }
}
...