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?')
        }
    }
}

Я нашел этот путь во время поиска обходного пути для проблемы с кодировкой файлов с задачей копирования.