All Articles ↓
15 месяцев назад
Долгожданный CLI для CUBA Platform

Не секрет, что мир разработчиков ПО, особенно разработчиков на Java, полон клавиатурных маньяков, которым проще набрать 10-15 символов, чем один раз кликнуть мышкой. Наше сообщество – не исключение. Нас постоянно спрашивают: «Как начать проект без CUBA Studio? » или «Как работать на CUBA без CUBA Studio?» Итак, у нас для вас хорошие новости!

Может ли бесплатный CLI заменить коммерческую версию CUBA Studio?

CLI не рассматривается как альтернатива CUBA Studio, у него другая миссия. CLI будет полезен тем разработчикам, у кого есть опыт работы с Spring Framework, JPA и инфраструктурой CUBA, и (важно!) которым комфортно работать в черном окне с серыми буквами. Если вкратце, cuba-cli — это утилита командной строки, которая служит именно для создания структуры проектов на CUBA Platform. CLI упрощает кодогенерацию основных артефактов проекта: сущностей, экранов, служб и т.д.

text

При этом Studio выполняет всю ту же функцию, что и раньше: это кратчайший путь в мир CUBA. Studio предоставляет интуитивный пользовательский интерфейс, который даже новичку в CUBA позволяет создать свое первое приложение за минуты, даже без опыта работы с JPA, или Spring, или лежащих в их основе технологий... По сути, вам вообще не нужно писать код, чтобы разработать стандартное CRUD приложение — Studio сделает это за вас. Также Studio будет отличным выбором для тех, кто переходит на CUBA с другой экосистемы, и для тех, кто привык к максимально комфортной IDE.

text

Короче говоря, CUBA Studio — это скорее тренажер для освоения платформы и огромная экономия времени, в то время как CLI — это рабочая лошадка, которая берёт на себя генерацию инфраструктуры и шаблонного кода.

Что умеет CLI?

Как вы понимаете, для начала CLI нужно установить. Он поддерживает основные ОС, и инструкцию по установке для каждой из них можно найти здесь. После установки просто введите cuba-cli в командной строке, и вперед —писать новый проект или дорабатывать существующий. Как обычно, с помощью Tab можно посмотреть список всех поддерживаемых команд, а традиционный help выводит краткое описание каждой команды. Давайте посмотрим, что эти команды делают «за кадром», как они экономят ваше время и продлевают жизнь вашим клавиатурам:

Стандартные команды

  • help, version, exit, cd— очевидно, эти команды не влияют на ваш исходный код, и их действие интуитивно понятно из названий.

Настройка проекта и основные настройки

  • create-app — проводит через необходимые для создания нового проекта CUBA шаги: имя проекта, namespace, корневой пакет Java-классов, версия платформы, используемая в проекте база данных. В проекте автоматом создаются модули global (доступный из core и web модулей), core (средний слой для бизнес-логики) и web (слой для управления экранами и другой UI логикой).
  • polymer — добавляет к приложению новый клиент, основанный на Polymer — библиотеке, разработанной Google. Конфигурация и задачи сборки нового модуля автоматически добавляются в скрипты settings.gradle и build.gradle. Также эта команда создает файлы требуемых ресурсов изображений и генерирует страницу логина, меню и другие полезные web-компоненты для приложения с Polymer front-end.
  • theme — создает специальную структуру папок внутри module/web, в которой располагаются изображения для брендирования приложения (иконка логина, меню и favicon) и несколько SCSS-файлов, в которых можно переопределить схему, установленную по умолчанию. Команда также добавляет модуль webThemesModule и его конфигурацию к файлам settings.gradle и build.gradle. Наконец, будет создана задача gradle deployThemes, позволяющая увидеть изменения без перезапуска сервера. Более подробно о темах можно посмотреть в этом разделе документации.
  • add-component — подключает существующий компонент в ваше приложение. Команда добавляет новую строку в блок зависимостей build.gradle, а в файл web.xml в web-модуле добавляет главный пакет компонента в контекст параметра appComponents.

Моделирование предметной области

  • entity — генерирует заглушку сущности JPA и ее DDL скрипты. Эта сущность будет также зарегистрирована в persistence.xml или metadata.xml, в зависимости от типа сущности — персистентная она или нет. Кроме того, CLI создаст пакет сообщений для локализации параметров сущности.
  • enumeration — генерирует Enum, реализующий интерфейс EnumClass, его поля с сообщениями для локализации и полезным методом fromId.

Бизнес-логика

  • entity-listener —генерирует Spring-компонент, реализующий интерфейс Entity Listeners, и объявляет его в соответствующем классе сущности. Такие listener’ы срабатывают, когда сущность меняет свое состояние. Более подробную информацию можете найти здесь.
  • service — создаёт интерфейс в global-модуле и его реализацию в core. Чтобы его можно было вызывать из веб-модуля, он регистрируется в определении бина WebRemoteProxyBeanCreator в web-spring.xml.
  • bean — просто генерирует компонент Spring и экономит ваше время на печать примерно 150 символов :)
  • config — генерирует заглушку конфигурационного интерфейса CUBA в заданном модуле и с выбранным типом (System, DB или App). Более подробную информацию о конфигурационных интерфейсах CUBA вы можете найти в этой главе документации.

Пользовательский интерфейс

  • screen — создаёт экраны универсального UI. Команда поддерживает:
    • создание нового пустого экрана,
    • расширение существующего экрана,
    • browser — экран просмотра списков сущностей с готовым CRUD-функционалом и фильтром,
    • editor — экран для создания и редактирования экземпляров сущностей.

Эта команда генерирует XML-дескриптор экрана и его Java-контроллер с пакетом локализаций сообщений. Дополнительно она может также добавлять экран в главное меню.

Прочее

  • app-component —добавляет приложению CUBA возможность встроить его в другое приложение CUBA, иными словами, делает его pluggable-компонентом. Более подробную информацию о концепции компонентов приложений вы найдете в документации. Эта команда генерирует файл app-component.xml, который определяет зависимости от других компонентов, описывает существующие модули приложения, генерируемые артефакты и предоставляемые свойства приложения. При выполнении команды вам будет предложено изменить текущее значение Module prefix на уникальное, чтобы избежать конфликтов имен. Если вы измените префикс, он также обновится в файлах settings.gradle и build.gradle.
  • update-script — создает SQL файл со скриптом обновления БД, который соответствует конвенции именования и размещения скриптов CUBA. CUBA Platform включает механизм применения скриптов обновления при старте приложения. Эти скрипты должны выполняться в историческом порядке от старых к новым. Чтобы обеспечить такой порядок, скрипты обновления помещаются в каталог modules/core/db/update/{USED DATABASE}/{yy}/ и именуются по принципу {yyMMdd}-{INCREMENT}-{SCRIPT NAME}.sql.
  • custom-template — генерирует файлы проекта по вашим собственным шаблонам Velocity. Механизм создания шаблонов позволяет расширять набор CLI команд декларативно и без компиляции. Более подробную информацию о движке шаблонов в CLI можно найти здесь.

Как видите, CLI берет на себя огромную часть работы, избавляя разработчика от скучной, но неизбежной рутины.

Расширяемость

Во-первых, как мы уже упомянули, CLI поставляется с движком шаблонов для расширения набора команд без необходимости изменять и перекомпилировать исходники. Шаблоны CLI состоят из двух частей:

  1. Файл template.xml, в котором декларативно описываются вопросы, задаваемые пользовательскими командами.
  2. Набор файлов (XML, Java и другие форматы) со скриптами Apache Velocity, которые могут быть обработаны движком Velocity. Ответы на вопросы из файла template.xml будут переданы как параметры и доступны из скриптов Velocity.

Подробную информацию о шаблонах CLI смотрите в wiki.

Во-вторых, CLI предоставляет точки расширения для загрузки пользовательских плагинов и публикует события, доступные для использования в пользовательских плагинах. С помощью этого механизма можно как создавать новые команды с максимальной гибкостью, так и расширять уже существующие, например, добавлять опции к команде screen: например, lookup. Документацию и руководство по созданию плагинов CLI вы можете найти здесь.

Наконец, CUBA CLI — это открытый проект, и его исходный код опубликован на GitHub. Мы будем рады как вашему вкладу в разработку (ознакомьтесь с contribution guideline), так и созданным issues, если что-то пойдёт не так. Так что, если обнаружите нужный, но не реализованный кейс, не стесняйтесь сделать пул-реквест для общего блага.

Заключение

Наш CLI ещё совсем молод, но мы надеемся, что с ним процесс разработки станет приятнее и быстрее, особенно, если вы не используете CUBA Studio. Конечно, мы планируем продолжить работу над CLI и уже составляем roadmap: здесь вы можете посмотреть, какие фичи мы готовим в следующей версии.

В завершение, я бы хотел дать совет. Если вы только начинаете знакомство с платформой и взялись за свой первый проект на CUBA, в голом CLI вам будет сложнее оценить для себя платформу. CUBA Studio имеет 30-дневный пробный период, так что если вы или ваши коллеги — новички в CUBA, рекомендую на начальной стадии использовать CUBA Studio, — так изучение платформы будет быстрее и нагляднее. После окончания пробного периода вы сможете решить, оформлять ли подписку и продолжать использовать CUBA Studio или переходить к CLI.

Для тех, кто устал читать, на нашем YouTube-канале можно посмотреть демо-ролик про CLI.

P.S. Ах, да, чуть не забыл похвалиться, что CLI написан на Kotlin. Это первый раз, когда мы используем этот язык в деле— и пока всё отлично!

Алексей Стукалов