Pull to refresh

Comments 7

Круто получилось. Когда разбирался с template тоже думал о подобном, но успокоился, когда FreeMarker стал работать и оставалось править только в файлах темлейтов, если что-то изменилось.
Вопрос: вы для темлейтов отдельный модуль делаете или где-то в 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, надеюсь это поможет остальным.


  1. Всё началось конечно же с того, что я поставила плагин, всё настроила по инструкции, попыталась сгенерить первый класс из шаблона и у меня ничего не заработало, а логов в студии было не видно. Поэтому решила запустить плагин из IDEA и посмотреть что же не так. На моей дорогой Ubuntu ничего не собралось. Но ошибка к счастью была довольно очевидная
    Specified localPath '/Applications/Android Studio.app' doesn't exist or is not a directory
    Потребовалось явно указать путь до студии в build.gradle файлах и всё отлично заработало и теперь можно было смотреть логи


    intellij {
    localPath = "/opt/android-studio/"
    }

  2. В моих шаблонах использовались глобальные переменные из 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

    Наверное именно перенос глобальных переменных занял в адаптации шаблонов под плагин наибольшее количество времени.


  3. И мой второй фича-реквест будет о том, что иногда в условных выражениях очень нужен оператор отрицания
    Например, раньше наш файл recipe.xml.ftl содержал вот такую логику


    <#if !isMergedStateHolder>
        <instantiate from="src/app_package/java/StateHolder.kt.ftl" to="${srcOut}/${stateHolderClassName}.kt"/>
    </#if>

    Как это перенести, я не смогла найти, проверила парсинг выражений, и вроде как возможно только задать "выполни эти команды, если true", а иногда хочется и если false. Тут выйти из ситуации несложно, просто переформулируешь пункт на противоположный, поэтому теперь у нас isSeparateStateHolder).
    Но это не помогает для выражений с видимостью элементов формы, там тоже не хватает отрицания.


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


    <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 для похожих целей, тоже планировали заняться этим в ближайшее время)

Ещё раз спасибо за подробный фидбек!

Да, для создания пустых модулей с заполненными под нашу архитектуру gradle файлами. Это не так круто, как создавать модули плагином, чтобы еще и все зависимости автоматически в проекте прописать от нового модуля, но лучше, чем модули, которая создает студия с миллионном ненужных ресурсов.

Sign up to leave a comment.