- PVSM.RU - https://www.pvsm.ru -

Адаптация Visual Studio для разработки под Salesforce — Введение

Disclaimer: Данный топик не содержит реализации того, что указано в заголовке, и не содержит технических деталей. Тут всего лишь перечислены проблемы, которые я собираюсь решать и краткий план как это должно быть реализовано. Учитывая новизну темы и неплохой уровень сложности для меня, я не ручаюсь что эта статья не будет первой и последней. Но мне честно хотелось-бы довести это начинание до конца, паралельно освещая его здесь. Эта статья выступает, в том числе, и дополнительной мотивацией.

Вступление к вступлению

Так уж сложилось что несколько недель назад мне пришлось переучиваться с C# разработчика на Salesforce разработчика. И я бы не прочь сказать что это оказалось просто и увлекательно (хотя это во многом так и есть), но один факт регулярно продолжает мне портить настроение и заставляет вспоминать любимый .NET. Последние 5 лет я работал исключительно с VisualStudio — раработка WinForms приложений, SIlverlight, чисто C# бекенд, TypeScript в качестве хобби. И я воспринимал сей инструмент как то, что будет со мной всегда, как то, что делает разработку комфортной, и глупо считал что остальные IDE находятся примерно на том же уровне развития (я упорно старался забыть свой опыт работы с каким-то Flex IDE на базе Eclipse).

И тут бац… Force.com IDE [1] — IDE на базе Eclipse для работы с Salesforce либо Mavensmate [2] плагин к Sublime Text.

Краткий ликбез

Разработка под Salesforce ведётся с использованием двух основных языков/технологий — Apex code [3] на базе Java, и VisualForce [4] — фреймворком для построения кастомной веб-части «приложений».
Особенность использования всей платформы Salesforce — облачность головного мозга [5] (не в упрёк — просто факт), а именно — компиляция кода Apex выполняется в облаке (причём локально это сделать невозможно) а разработка может вестись и, непосредственно, в браузере с помощью т.н. Developer Console, которая представляет из себя слабое подобие IDE.

Ну ок, классно, бери любой IDE для Java и работай в нём. Нельзя, ибо язык действительно отличается, а вышеуказанная ОГМ обязывает нас каждый чих сохранять в облако и компилировать его там.

Зачем?

Вполне резонный вопрос — а почему, собственно, не переучиться на новую IDE как нормальный человек? Тут, для меня, всё довольно просто:

  • Глупая привычка к хорошему инструменту
  • Возможность выучить что-то новое
  • Идея part-time проекта, которая не будет «проект ради проекта»
  • Возможность попробовать свои силы
  • Возможность сделать мир лучше?
  • Неудобство доступных инструментов

Последний пункт стоит рассмотреть немного детальнее — так как я всего пару недель как начал этим интересоваться, список у меня накопился небольшой, но достаточный для меня:

  • Отсутствие достойной альтернативы IntelliSense в Force.com IDE — ищет по первым буквам, сильно тормозит, не очень в курсе про кастомные классы и их свойства/методы (тут может быть я что-то и неправильно сказал, но у меня получилось именно так). Зато более-менее неплохо работает в Mavensmate
  • Отсутствие подсветки синтаксических ошибок в Mavensmate — сохраняем, отправляем в облако, ждём секунд 20-30 и узнаём что забыли точку с запятой. В следующий раз мы узнаём что забыли ещё одну точку с запятой парой строк ниже. Зато неплохо работает в Force.com IDE
  • Полное остутствие возможности группировать файлы (классы/триггеры/страницы в их терминологии) хотя-бы по папкам — есть три системных папки в которых файлы лежат согласно их категории, ВСЁ. Действительно глупо видеть в 2014м году названия файлов вида "AAAAClassName", "AAALessImportantClassName" и т.п… Такова структура кода в Salesforce, но раз уж у нас отдельный софт — можно было бы и побороться с этим (хотя-бы с помощью симлинков).
  • Каждое сохранение файла приводит к тому что он отправляется в Salesforce и там компилируется. Извините, но у меня есть дурацкая привычка нажимать Ctrl+S после каждой строчки. А если я задумаюсь о чём-то в середине строки — я могу нажимать Ctrl+S пока не вернусь в реальность. Извините, но компиляция и сохранение файлов это не одно и тоже в моём мире.
  • Неадекватный механизм взаимодействия с Salesforce у Mavensmate — генерируемые странички, которые открываются в браузере и отображают результаты взаимодействия с SF (запуски тестов, логи и т.п.)

В качестве темы для обсуждения было-бы интересно узнать — а как Вы относитесь к подобным особенностям IDE?

И как мы это будем решать?

Из заголовка и предыстории потяне общий вектор — расширение для Visual Studio, которое позволит нам полноценно работать с Salesforce кодом. Если разобрать концепцию на принципиальные блоки — я бы выделил вот что (именно в таком порядке):

  1. Подсветка синтаксиса Apex
  2. Подсветка синтаксиса VisualForce
  3. Поддержка «проектов» Salesforce (включая разделение понятий Save и Compile)
  4. Имплементация IntelliSense
  5. Отображение синтаксических ошибок
  6. Панели для работы с юнит-тестами и логами Salesforce
  7. Сборка Visual Studio for Salesforce на базе Visual Studio Shell для свободного standalon распостранения
  8. Остальной сахар по мере сил и возможностей
Интересные задачи на первые этапы

Одной из самых интересных проблем (спасибо Salesforce) является отсутствие где-либо грамматики как самого Apex так и VisualForce. Да, Apex построен на базе Java, но изменений там прилично и строить грамматику основываясь на оной из Java и текстовом reference Apex'a долгая и нудная задача… Но иных вариантов я не нашёл, поэтому процесс запущен.
Что важно при формализации грамматики — на чём в дальнейшем будет строиться лексер — ANTLR [6] либо Irony [7] (два самых интересных проекта). У ANTLR мне намного больше нравится формат задания грамматики (он намного более привычен для меня, ибо не смешивается с кодом), но подход самого проекта мне не нравится — Java приложение которое генерирует лексер автоматически (на Java либо C#). Irony намного более гибок и свободен в выборе как и что реализовывать, но задание грамматики мне не нравится — ужасный микс кода и BNF правил.
Буду благодарен за любую дополнительную информацию по подобным инструментам для .Net в комментариях

Вторая проблема с которой я столкнулся за неделю изучения материалов и неспешного ковыряния во внутреностях VS SDK — документация [8] и примеры. Я серьёзно всегда считал документацию на msdn одним из лучших примеров. Всё есть, отличные туториалы, примеры, детальная информация. В данном же случае — полная фигня. Примеры из статей msdn не компилируются (ну фиг с ними), после банального исправления тупых ошибок код просто не работает. Информация (которой кот наплакал) размазана по разным местам и важные нюансы можно собирать по десятку разных материалов. VS SDK 2013 (а именно под эту версию я собираюсь разрабатывать расширение) примерами не снабжается, а примеры из VS SDK 2010 неполные и устаревшие (используются старые подходы без Managed Package Framework [9] а сам лексер так вообще не включён в пример — приходится использовать .NET Reflector для выковыривания кода.

Следующие шаги

Как я уже писал — я не уверен в том, что смогу довести данный проект до адекватного вида, но, надеюсь, это случится. Сейчас я выковыриваю информацию по Syntax Highlighting и, паралельно, работаю над грамматикой Apex. При хорошем стечении обстоятельств примерно через месяц я бы хотел поделиться с вами прогрессом, если же через месяц ничего не произойдёт, знайте — я пал под давлением Apex либо Visual Studio :)

Буду благодарен за полезные ресурсы, статьи, советы, примеры реализации Language Service для Visual Studio 2010+ (IronPython не вариант) и вообще по теме.

Спасибо за внимание.

Автор: Bick

Источник [10]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/55766

Ссылки в тексте:

[1] Force.com IDE: http://wiki.developerforce.com/page/Force.com_IDE

[2] Mavensmate: http://mavensmate.com/

[3] Apex code: http://wiki.developerforce.com/page/Apex_Code:_The_World's_First_On-Demand_Programming_Language

[4] VisualForce: http://wiki.developerforce.com/page/User_Interface

[5] мозга: http://www.braintools.ru

[6] ANTLR: http://www.antlr.org/

[7] Irony: http://irony.codeplex.com/

[8] документация: http://msdn.microsoft.com/en-us/library/bb165099.aspx

[9] Managed Package Framework: http://msdn.microsoft.com/en-us/library/bb166533.aspx

[10] Источник: http://habrahabr.ru/post/213677/