2014-08-06 3 views
2

Моя цель - программно изменить файл Android build.gradle. Я хочу добавить плагин на определенную строку, а затем зависимость в определенном разделе dependency.Как программно изменить файл Groovy/Gradle в Groovy?

Мой вопрос: содержит ли Groovy синтаксический анализатор для своего родного языка? Как я могу легко модифицировать файл build.gradle (или любой файл Groovy) программно?

+1

Посмотрите на исходный код groovyConsole. Консоль имеет возможность показать вам ast (абстрактное синтаксическое дерево) вашего источника. Но не ожидайте, что это будет легким решением вашей проблемы :-) – rdmueller

+0

Спасибо .. Но нет пути от АСТ до исходного кода, не так ли? (Я только просмотрел http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations) – Nilzor

+1

Нет простого способа. По крайней мере, теперь вы знаете, что hrails содержит свой собственный синтаксический анализатор :-( – rdmueller

ответ

0

AfaIk, программно изменяя groovy-файл, непросто. Существуют синтаксические анализаторы, такие как сборка в аналитическом анализаторе AST или конфигураторе slurper, но нет простого способа вернуться к коду. A и все эти парсеры бросают не только форматирование, но и комментарии. Полученный источник не будет тем, что вы ожидаете.

Плагины Grails часто имеют одинаковую проблему. Решение состоит в том, чтобы использовать регулярные выражения для изменения кода или вообще не изменять код (добавив дополнительную конфигурацию вместо изменения оригинала).

+1

Я бы осторожно сказал: «Регулярные выражения - это решение», но мне нравится ваш намек на то, чтобы вообще не менять код, добавляя дополнительные конфиги. Я понимаю, что Gradle является гибким в том, что вы можете определить, например, раздел 'dependencies' несколько раз. – Nilzor

+0

Если это вариант, я думаю, что это лучший способ. – rdmueller

+1

Я решил свою конкретную проблему, добавив некоторые строки в конце сборки. файл градиента, игнорируя все, что в нем первоначально. Возможно, не работает для каждого варианта использования, но работал для меня, поэтому я принимаю ваш ответ;) – Nilzor

Смежные вопросы