Пунктирные строки свойств - PullRequest
3 голосов
/ 31 августа 2011

У меня есть хэш строк, подобный этому:

Map map = ['a.b.c': 'Hi']

... что мне нужно использовать в gradle, чтобы расширить выражение вроде этого:

This is a greeting: ${a.b.c}

Если я использую задачу копирования копии с расширением, я получу сообщение об ошибке «Нет такого свойства: a».

Есть ли способ заставить gradle / groovy преобразовать эту карту в свойства, которые мне нужно разрешить?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Я не смог найти встроенный ответ, но это полный автономный метод, который можно использовать в качестве мета-метода на карте для выполнения того, что вы хотите:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy']

Map.metaClass.expandKeys = { separator = '.' ->
    def mergeMaps = { a, b ->
        b.each{ k, v ->
            if(a[k] && (v instanceof Map)) {
                mergeMaps(a[k], v)
            } else {
                a[k] = v
            }
        }
        a
    }
    delegate.inject([:]){ result, k, v ->
        mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] })
    }
}

assert map.expandKeys() == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]]

Он также позволяет использовать разделители, отличные от ., просто передайте разделитель в метод expandKeys

Если вы хотите использовать его как обычную функцию, вы можете сделать это вместо этого:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy']

def expandKeys = { Map input, separator = '.' ->
    def mergeMaps = { a, b ->
        b.each{ k, v ->
            if(a[k] && (v instanceof Map)) {
                mergeMaps(a[k], v)
            } else {
                a[k] = v
            }
        }
        a
    }
    input.inject([:]){ result, k, v ->
        mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] })
    }
}

assert expandKeys(map) == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]]

Основной трюк, помимо объединения карт, состоит в том, чтобы разделить, а затем повернуть каждый ключ.Тогда окончательная иерархия может быть построена в обратном направлении.Кроме того, может быть лучший способ справиться со слиянием, потому что мне не нравится зависание a в конце.

1 голос
/ 31 августа 2011

Я ничего не знаю о Gradle, но, возможно, это поможет ....

Если у вас есть карта

Map map = ['a.b.c': 'Hi']

Тогда вы не сможете получить значение 'Привет'используя

map.a.b.c

Вместо этого вы должны использовать:

map.'a.b.c'

или

map['a.b.c']
0 голосов
/ 01 сентября 2011

Я не совсем уверен, что вам нужно, но если вам просто нужно заменить свойства-подобные токены и не нужны все возможности шаблонов Groovy, метод filter() в сочетании с классом Ant ReplaceTokens более безопасная (и более быстрая) ставка, чем expand(). См. Фильтрация файлов в Руководстве пользователя Gradle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...