Розробка в InterSystems Caché в вашої улюбленої IDE

Доброго дня! У InterSystems Caché є цілком практичний спосіб розробляти рішення без використання інтегрованих в неї інструментів. Весь код проекту можна зберігати у вигляді традиційних файлів з вихідним кодом, редагувати в улюбленій середовищі розробки, індексувати системою контролю версій і однією командою виконувати імпорт та компіляцію класів у СКБД Caché. Більш того, це надає можливість використовувати будь-які інші зовнішні інструменти, наприклад, для складання і препроцессинга коду. У даній статті буде розглянуто поки що не традиційний для Caché, але досить практичний цикл розробки проектів.

Дана стаття описує кілька найпростіших способів організації розробки проекту на технологіях InterSystems без використання вбудованих інструментів (студії). Кожен спосіб може бути модифіковано та розширено до повноцінного інструменту завантаження, складання або навіть налагодження проектів на InterSystems Caché, але метою статті є надання засад запропонованого підходу до організації розробки і його обговорення.

Описані нижче способи організації розробки передбачають наступне:

  1. Весь проект (вихідний код) знаходиться у файловій системі, з довільною структурою каталогів.
  2. Директорія проекту індексується системою контролю версій Git.
  3. Вихідний код класів записаний в файли у «чистому вигляді», дотримується ієрархія класів і пакетів.
  4. Робота над проектом ведеться цілком у файловій системі, написання коду — в будь-якому зовнішньому редакторі або IDE.
  5. Є можливість підключити будь-які додаткові інструменти, наприклад, для препроцессинга коду, макроподстановок на етапі складання, складання front end і так далі.
У даній статті не будуть розглядатися рутини, CSP і інші файли. Роботу з першими можна організувати точно так само, як і з класами, тому в разі необхідності, за аналогією з поданим прикладом у статті, можна реалізувати підтримку рутин самостійно. CSP-файли є просто файлами на диску, і їх не потрібно імпортувати в СКБД Caché, а тільки переміщати з однієї директорії до іншої за аналогією з наведеним у статті способом.

Описаний у статті спосіб не вимагає ніяких додаткових інструментів і платформ, крім встановленої InterSystems Caché версії 2016.2+ (відповідно, Ensemble та інших). Додатково буде розглянуто збірка і препроцессинг клієнтського коду, виконана на технології Node.JS, відкритої та вільної для установки на робочу машину. Даний метод можна виконати також і з використанням будь-яких інших технологій, включаючи саму СКБД Caché. NodeJS був обраний, тому що для нього існує безліч вже готових пакетів для виконання завдань по збірці і препроцессингу проектів.

Мотивація та переваги
Виникає питання, чому б просто не продовжувати розробляти в студії, або перейти на «нову студію», названу Atelier? Який сенс у тому, щоб не використовувати її?

Мова програмування Caché ObjectScript (COS) відрізняється від інших найбільш поширених мов, таких як C#, Java, JavaScript, Python, Ruby і т. д. тим, що для роботи з ним «з коробки» доступні лише запропоновані і підтримувані InterSystems інструменти розробки. Є також кілька авторських рішень, але всі вони за задумом не багато чим відрізняються від програмування в студії. Програми на Caché ObjectScript, як і їх вихідний код, зберігаються безпосередньо у самої СКБД Caché. До появи підтримки UDL InterSystems Caché 2016.2 (або CDL у версії 2013.2 — читайте далі), для того, щоб отримати код у вихідному вигляді з БД у файли потрібно було написати чималу програму, і докласти ще більше зусиль, щоб покласти цей код назад в СКБД Caché. Тепер, коли це можливо лише за допомогою однієї команди, без праці можна організувати «традиційну» модель розробки рішень: редагування файлів вихідного коду — компіляція — отримання результату.

До появи ще не випущеної у світ Atelier вести розробку в Linux/MacOS/… було просто неможливо, так як Caché Studio існує тільки для Windows-платформ. Спосіб, описаний у статті, абсолютно багатоплатформовий.

Проекти рідко коли включають виключно класи Caché. Виникає питання про те, як грамотно зберігати вихідний код всього проекту в одному сховищі системи контролю версій. І по сьогоднішній день для проектів на InterSystems Caché застосовується своєрідний цикл розробки — фактична робота над класами в СКБД Caché ведеться в студії, а в репозиторій проекту потрапляє лише XML представлення класу, не призначене для будь-яких модифікацій. У випадку з Atelier цикл розробки, знову ж таки, заточений під роботу виключно в ній самій, без будь-яких взаємодій із зовнішніми інструментами. Єдине що, у новій IDE з'явилася явна можливість експорту/імпорту вихідного коду у файли UDL, які згодом можуть бути проіндексовані системою контролю версій, але не більше того. Немає взаємодії з зовнішніми інструментами, збирачами, аналізаторами коду, препроцессорами, немає підтримки довільної структури проекту, мета-файлів і в цілому, буде підтримка тільки того, що InterSystems вважатиме за потрібне підтримувати в рамках Atelier і Eclipse.

І, нарешті, найголовніша мотивація, приймаючи до уваги все перераховане вище — це відкрити Caché ObjectScript для всього світу. Це може викликати появу open-source плагінів для підтримки COS найпопулярнішими IDE, підтримуваних співтовариством, неминуче майбутню підсвічування синтаксису cls-файлів, в тому числі і на GitHub, і безліч різних інструментів, наприклад, для аналізу або рефакторінгу коду.

Введення
У Caché версії 2016.2 з'явилася підтримка вивантаження вихідного коду в UDL (Universal Definition Language) з допомогою методів класу $system.OBJ. У даній статті будуть розглядатися робота з методами саме цього класу. У більш ранніх версіях, починаючи з InterSystems Caché 2013.2 вивантаження коду класів у вихідному вигляді також була можлива з використанням методів класу %Compiler.UDL.TextServices. Все це дозволяє завантажувати і вивантажувати з Caché фізичні файли з вихідним кодом класів або рутин в такому вигляді, в якому їх можна переглянути в студії. Варто також відзначити, що починаючи з версії 2016.2 доступний ще й Atelier REST API для вивантаження визначення класів з СКБД Caché.

Так як раніше була можливість експортувати та імпортувати тільки XML представлення класів, що значною мірою робило вихідний код малочитабельным, UDL відкриває нові можливості для ведення розробки проектів з продуктами InterSystems (Caché, Ensemble, HealthCare і інші).

Результатом цієї статті буде розглянуто проект, організований у файловій системі, і декілька скриптів, які дозволяють однією командою зібрати і імпортувати його в СКБД Caché.

Підготовка
Припустимо, у нас буде, або вже є проект на InterSystems Caché, який складається з класів Caché (а також, можливо, рутин і статичного front end). Це необхідна і достатня умова, щоб почати застосовувати описаний у статті метод розробки до існуючого або нового проекту.

Передбачається, що на машині вже є локально встановлена СКБД Caché версії 2016.2+, в яку буде проводитися імпорт проекту. Для впровадження даного способу розробки в більш ранні версії InterSystems Caché (починаючи з 2013.2), вам необхідно буде адаптувати запропоновані приклади, використовуючи методи %Compiler.UDL.TextServices. Заповнивши форму посилання, ви можете завантажити і встановити пробну версію продукту. При установці, вкажіть кодування Unicode замість 8-bit, а всі інші пункти, запропоновані майстром установки, залиште без змін.

У статті буде застосовуватися система контролю версій Git. Якщо у вас не встановлений Git, його необхідно встановити.

Створення проекту
Структура директорії проекту-демонстрації має наступний вигляд:

При цьому:

  1. Вихідний код проекту знаходиться в директорії «source», а у відповідній піддиректорії «cls» знаходяться дерево пакетів-класів проекту. На скріншоті вище проекту, як приклад, знаходиться пакет DevProject, а в ньому клас Robot (DevProject.Robot), REST — подпакет з класом всередині (DevProject.REST.Index).
  2. Скрипт import.* імпортує проект в СКБД Caché.
Код проекту, показаного вище, доступний на GitHub. Пропонується клонувати проект на локальну машину, виконавши наступну інструкцію:

git clone https://github.com/ZitRos/cache-dev-project

Проект містить у собі директорію source/cls, в якій знаходиться звична ієрархія пакетів. Для демонстрації був створений найпростіший клас, що містить клас-метод Message, який виводить повідомлення «Welcome, Anonymous!»:

Class DevProject.Robot
{

ClassMethod Message(name As %String = "Anonymous")
{
write "Welcome, ", name, "!"
}

}

Щоб імпортувати цей та інші класи в СКБД Caché, можна скористатися одним з наступних способів:

1. Використовувати нове середовище розробки від InterSystems — Atelier:



Зрозуміло, виконувати зазначені дії кожного разу, коли потрібно протестувати роботу проекту накладно, тому ми будемо використовувати другий варіант.

2. Виконати в терміналі наступну команду:

do $system.OBJ.ImportDir("D:/Path/To/Project/source/cls",,"ck /checkuptodate=all",,1)

Дана команда рекурсивно завантажує всі файли з директорії D:/Path/To/Project/source/cls у поточний простір імен, а також компілює ті класи, які змінилися з останнього моменту імпорту. Таким чином, повторно завантажені класи без змін не будуть займати час на компіляцію.

Другий варіант також є не найзручнішим рішенням — кожен раз, коли починається робота над проектом, необхідно відкривати термінал Caché, вводити там пару логін-пароль (на примірниках з рівнем захисту normal і вище), переходити в потрібний простір імен і нарешті виконувати команду, збережену десь в блокноті. Існує можливість автоматизувати за допомогою третього варіанта.

3. Створити shell-скрипт (batch-скрипт) і викликати його кожен раз, коли необхідно імпортувати класи в InterSystems Caché:

import

Простоту виклику останнього у випадку з веденням розробки майже будь-якої зовнішньої IDE можна звести до натиснення однієї кнопки. Таким чином, весь проект знаходиться у файловій системі, робота ведеться з файлами, і при необхідності скомпілювати і запустити проект виконується лише одна команда.

Скрипт import
Розглянемо скрипт, який імпортує проект в СКБД Caché. Для того, щоб це зробити, йому необхідно трохи додаткової інформації про вашому екземплярі Caché, а саме місце розташування встановленої Caché, область, у яку буде проводитися завантаження, а також ім'я користувача і пароль для входу в систему. Ці дані редагуються безпосередньо в скрипті. Скрипт рекомендується зберігати в репозиторії і робити його локальну копію з актуальними даними при розгортанні проекту на локальній машині.

Вихідний код скрипта доступний на GitHub для <a href=«github.com/ZitRos/cache-dev-project/blob/master/import.cmd>Windows і *nix систем. Все, що потрібно зробити — один раз відредагувати кілька змінних в скрипті перед початком роботи над проектом.

Скрипт запускає виконуваний файл cache.exe, який знаходиться в директорії /bin/ встановленої СУБД, і передає йому два аргументи — директорію з базою даних і простір імен. Потім на вхід, через термінальний інтерфейс InterSystems Caché скрипт відправляє ім'я користувача, пароль і кілька простих команд на мові Caché ObjectScript, що імпортують класи і повідомляючи про успішне імпорті або виникла помилку.

Таким чином користувач отримує всю необхідну інформацію про імпорт та компіляцію класів, а також про помилки, які виникли під час компіляції. Приклад виводу при виклику скрипта import.bat:

Importing project...
Node: DESKTOP-ILGFMGK Instance: ENSEMBLE20162

USER>
Load of directory started on 06/29/2016 22:59:10

Loading file C:\Users\ZitRo\Desktop\cache-dev-project\source\cls\DevProject\Robot.cls as udl
Loading file C:\Users\ZitRo\Desktop\cache-dev-project\source\cls\DevProject\REST\Index.cls as udl

Compilation started on 06/29/2016 22:59:10 with qualifiers 'ck /checkuptodate=all'
Class DevProject.REST.Index is up-to-date.
Compiling class DevProject.Robot
Compiling routine DevProject.Robot.1
Compilation finished successfully in 0.003 s.

Load finished successfully.
IMPORT STATUS: OK

Тепер можна переконатися, що проект завантажений. Для цього можна викликати тестовий метод класу з терміналу Caché:

USER > do ##class(DevProject.Robot).Message()
Welcome, Anonymous!

У разі, якщо встановлена версія СКБД Caché менше, ніж 2016.2, ви отримаєте наступну помилку:

ПОМИЛКА #5840: Неможливо імпортувати файл '/root/source/cls/Index.cls', т. до. цей тип не підтримується.

Розширений приклад
Для отримання максимальної вигоди від розробки проекту на технологіях InterSystems, спробуємо зробити щось більш привабливе, додавши графічний інтерфейс і складання проекту на NodeJS і Gulp. Результатом буде веб-сторінка, зображення якої показано нижче.



Акцент буде зроблений на те, як саме можна організувати розробку такого проекту. Насамперед необхідно розглянути архітектуру пропонованого рішення.



Проект складається з статичної клієнтського коду (HTML, CSS, JavaScript), класу на сервері, який описує REST-інтерфейс і одного зберігається в базі даних класу.

Клієнт за допомогою GET-запиту отримує список роботів, які знаходяться на сервері. Так само, при натисканні на кнопку „Spawn a new robot!“ клієнт відправляє GET-запит на сервер, в результаті чого створюється новий екземпляр класу Robot, та додається до відображається список.

Технічну реалізацію проекту можна подивитися на GitHub (гілка „extended“). У статті далі увагу буде приділено саме способу розробки подібних проектів.

Структура директорії розширеного проекту-демонстрації має вигляд, показаний на зображенні зліва.

Тут, на відміну від попереднього прикладу, добавлена клієнтська частина програми, яка знаходиться в директорії `source/static`, а також організовано складання проекту за допомогою Node.JS і Gulp.

Наприклад, крім іншого коду у проекті присутні спеціальні коментарі. Приклад:

<div class="version">v<!-- @echo package.version --></div>

При складанні проекту цей коментар буде замінений на версію проекту, яка вказана в файлі package.json. Так само складальник виконує минификацию CSS і JavaScript коду, і копіює весь оброблений код в директорію `build`.

В скрипт `import`, на відміну від попереднього прикладу, були додані наступні зміни:

  1. Перед імпортом виконується складання проекту.
  2. Файли для імпорту тепер імпортуються з директорії `build`, так як вони проходять через препроцесор.
  3. Здійснюється копіювання файлів з директорії `build/static` в директорію з CSP-файлами Caché `csp/user`. Таким чином, після імпорту додаток відразу стає доступним.
Детальна інструкція по установці і запуску даного проекту знаходиться в описі до дерева.

В результаті отримано проект, який потрібно настроїти всього один раз, шляхом зміни декількох змінних у файлі `import.*`.

Розглянутий цикл розробки застосовується в декількох проектах — Caché Visual Editor і Caché Web Terminal. Незабаром він може знайти застосування і в інших проектах, включаючи ваші власні.

Середовище розробки і налагодження
Даний метод розробки не передбачає налагодження без InterSystems Caché. Якщо ви отлаживаете COS-код більше, ніж простим логированием в глобаль, вам доведеться використовувати інтегровані в Caché інструменти для налагодження.

З описаним методом розробки з'являється велика перевага — можливість використовувати улюблену середовище розробки для написання COS коду, vim або простий блокнот, розробляти Mac OS або *nix на COS так само, як і на будь-яких інших мовах програмування. Але з іншого боку COS зараз практично не має ніякої підтримки за межами цієї СУБД. Це означає, що навіть підсвічування синтаксису на даний момент не підтримується редакторами, не кажучи вже про автодополнении. Але все це найближчим часом зобов'язана змінитися на краще, і всі допоміжні засоби сьогодні вже готові бути втілені в життя.

А тим часом, поки Caché ObjectScript поширюється, можна скористатися елементарної підсвічуванням синтаксису за ключовими словами, яку пропонують деякі IDE, такі як IntelliJ. І вона досить непогано справляється зі своїм завданням:



У випадку з IntelliJ можна спробувати це прямо зараз — ось файл з налаштуваннями, який потрібно імпортувати, використовуючи меню File -> Import Settings. Підсвічування авторська, неповна, доповнення вітаються.

Висновок
Мета даної статті — привнести в світ розробки на InterSystems Caché щось нове, представити публіці ще один варіант ведення розробки і сприяти поширенню Caché ObjectScript як мови програмування в цілому. Будь-які відгуки, ідеї та обговорення вітаються.

p.s.Досвідчений читач міг помітити, що у разі, якщо імпорт відбувається примірник Caché з налаштуваннями безпеки minimal, Caché не запитує ім'я користувача та пароль, і, в результаті, якщо залишити скрипт без змін, з-за спроби скриптом ввести ім'я користувача та пароль не туди, куди очікувалося, двічі повертається синтаксична помилка. Це ніяк не впливає на роботу скрипта, поки ім'я користувача або пароль, наприклад, не буде halt.

Попросіть в коментарях спосіб, як визначити, чи потребує Caché введення імені користувача і пароля, і якщо не вимагає, то не подавати їх на введення. Звичайно, під такі потреби можна просто вирізати кілька рядків з скрипта, чого абсолютно достатньо, але нехай це питання залишається відкритим.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.