Gradle - изменить маркер Begin/End при использовании ReplaceTokens
У меня есть файлы, требующие замены токенов. Вместо стандартного сингла @они используют double @... Мне нужны вещи вроде: @@replaceme @@.. заменены.
Ant Фильтр ReplaceTokens позволяет установить его с помощью BeginToken/EndToken. Хотя я не уверен, как его настроить в моем примере:
copy{
into something
from somethingelse
filter(ReplaceTokens, tokens: [])
}
Как я могу изменить приведенный выше код, чтобы правильно заменить работу с помощью двойных @@токенов вместо отдельных?
Ответы
Ответ 1
Легко изменить разделители - просто добавьте именованные параметры beginToken
и endToken
в вызов метода filter
. Однако Ant ReplaceTokens
поддерживает только односимвольные разделители. Быстрый веб-поиск не включал Ant FilterReader
, который поддерживает произвольные многосимвольные разделители. Альтернативой является кодирование этого самостоятельно либо путем реализации FilterReader
, либо с помощью метода свободной формы filter.
Ответ 2
Я был в подобной (не точной) ситуации. Пришлось обрабатывать ресурсы тестового ресурса, которые были в формате maven. i.e '$ {}'.
Когда я перешел на gradle, задача processTestResources не заменила значения в ${}. Это связано с той же причиной, что он использует "@" single char. Я нашел взломать то, что хотел.
configure(tasks.processTestResources) {
include '**/*.properties'
filter(ReplaceTokens,
tokens: ['$':'={'], beginToken : '=', endToken : '{')
filter(ReplaceTokens,
tokens: [project.properties], beginToken : '{', endToken : '}')
}
Ответ 3
Другие ответы кажутся старыми и сообщают, что вы не можете использовать многосимвольные разделители токенов. Но я обнаружил, что больше не будет с Gradle 2.14.1
copy{
into something
from somethingelse
filter(ReplaceTokens, tokens: [map], beginToken : '@@', endToken : '@@')
// or, maven prop stle:
// filter(ReplaceTokens, tokens: [map], beginToken : '${', endToken : '}')
}
Ответ 4
Здесь другое решение. Используйте задачу Ant copy вместо задачи Gradle copy.
task copyWithMultiCharTokenMark << {
ant.copy(todir: 'copy_into_dir') {
fileset(dir: 'copy_from_dir')
filterset(begintoken:'@@', endtoken:'@@') {
filter( token:'replaceme', value:'Am I replaced?')
}
}
}
Я нашел этот путь во время поиска обходного пути для проблемы с кодировкой файлов с задачей копирования.