Комментарии 7
Вопрос: вы для темлейтов отдельный модуль делаете или где-то в common храните?
Свои шаблоны мы храним в отдельном, открытом репозитории — github.com/hhru/android-style-guide/tree/master/tools/geminio
Этот репозиторий мы подключаем в качестве submodule-я к нашему основному репозиторию, так что, по сути, всё хранится в отдельном месте.
То есть вы его собрали как артефакт и через dependencies подключаете?
Я имел в виду Git submodule.
В нашем основном репозитории хранится указание на нужный коммит репозитория с шаблонами. Когда мы скачиваем проект из github-а, мы выполняем команды
git submodule init
git submodule update
И код из репозитория добавляется внутрь нашего основного проекта. Из IDE это выглядит так, будто код шаблонов лежит прямо в нашей кодовой базе, вы даже можете менять текст шаблонов в своём проекте, но это не повлияет на код шаблонов в отдельном репозитории.
Несколько лет пользовались File Templates и с выходом новой студии прошли все стадии принятия горя, что их поддержки больше нет. Спасибо за плагин, он помог сохранить все наши шаблоны и решить проблему, не тратя время на написание какого-то нового решения. В целом за день я смогла перевести 6 группы шаблонов для разных модулей и экранов <3
Хочу оставить пару фича-реквестов и поделиться, какие проблемы встретила, потока адаптировала наши шаблоны под работу с Geminio, надеюсь это поможет остальным.
Всё началось конечно же с того, что я поставила плагин, всё настроила по инструкции, попыталась сгенерить первый класс из шаблона и у меня ничего не заработало, а логов в студии было не видно. Поэтому решила запустить плагин из IDEA и посмотреть что же не так. На моей дорогой Ubuntu ничего не собралось. Но ошибка к счастью была довольно очевидная
Specified localPath '/Applications/Android Studio.app' doesn't exist or is not a directory
Потребовалось явно указать путь до студии в build.gradle файлах и всё отлично заработало и теперь можно было смотреть логи
intellij { localPath = "/opt/android-studio/" }
В моих шаблонах использовались глобальные переменные из globals.xml.ftl, но их значения не подтягивались и видимо пока работа с ними не предусмотрена.
Часть переменных я вынесла в локальные внутри файлов шаблонов через:
<#assign viewClassName = "${screenName}View">
Ну а часть оформила в виде невидимых полей внутри формы.
- stringParameter: id: viewClassName name: Имя файла экрана help: The name of view class default: ${screenName}View suggest: ${screenName}View visibility: false
Наверное именно перенос глобальных переменных занял в адаптации шаблонов под плагин наибольшее количество времени.
И мой второй фича-реквест будет о том, что иногда в условных выражениях очень нужен оператор отрицания
Например, раньше наш файл recipe.xml.ftl содержал вот такую логику
<#if !isMergedStateHolder> <instantiate from="src/app_package/java/StateHolder.kt.ftl" to="${srcOut}/${stateHolderClassName}.kt"/> </#if>
Как это перенести, я не смогла найти, проверила парсинг выражений, и вроде как возможно только задать "выполни эти команды, если true", а иногда хочется и если false. Тут выйти из ситуации несложно, просто переформулируешь пункт на противоположный, поэтому теперь у нас isSeparateStateHolder).
Но это не помогает для выражений с видимостью элементов формы, там тоже не хватает отрицания.
И последнее чему я не нашла аналог, это как создать пустые директории без файлов, раньше мы использовали
<mkdir at="${moduleName}" /> <mkdir at="${moduleName}/src/main/java/${slashedPackageName(packageName)}/${moduleName}" /> <mkdir at="${moduleName}/src/main/res" />
В заключении хотела бы еще раз сказать спасибо за такой прекрасный плагин, и по ощущениям подход с хранением шаблонов внутри проекта гораздо удобнее старого коробочного хотя бы тем, что каждый проект может "подправить" что-то под себя значительно быстрее. Потому что теперь даже не надо искать папку с шаблонами внутри файлов студии, а все в твоем же проекте под рукой.
По пунктам:
1. Забыл упомянуть в статье, что мы всё тестировали только на MacOs, на других системах не пробовали даже. Похоже, что нужно дописать в инструкцию шаги, что делать, если у вас другая операционная система, спасибо.
2. Globals специально не переносили. Всегда раздражало переключаться постоянно между template и global-ом. Но сейчас их стало не хватать самим, не очень удобным кажется добавление таких «переменных» через stringParameter. Возможно, добавлю секцию globals с возможностью туда внедрять нужные переменные с expression-ами.
3. Да, оператора отрицания тоже стало не хватать, добавлю в ближайшее время.
4. А вы это использовали для создания новых модулей? У нас есть планы докрутить функционал Geminio для похожих целей, тоже планировали заняться этим в ближайшее время)
Ещё раз спасибо за подробный фидбек!
Магическая шаблонизация для Android-проектов