plugin development for intelli j platform
DESCRIPTION
TRANSCRIPT
![Page 2: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/2.jpg)
Continuous Integration
● сборка плагина● запуск тестов● установка и обновление плагина в IDE
![Page 3: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/3.jpg)
Структура дистрибутива плагинаsamplePlugin.zip
samplePluginlib
samplePlugin.jarplugin classesMETA-INF
plugin.xmlpluginLib.jar...
![Page 4: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/4.jpg)
Сборка плагина вне IDE
● IntelliJ IDEA Project runner (TeamCity)● Ant (Build | Generate Ant Build)● ...
![Page 5: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/5.jpg)
Настройка проекта для сборки на TeamCity
создание артефакта для плагина (File | Project Structure | Artifacts)
![Page 6: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/6.jpg)
Build Configuration на TeamCity
● настройка VCS● настройка внешних зависимостей (IDEA
SDK)○ получение через VCS○ копирование на build agent○ получение из стороннего репозитория
(отдельный build step)
![Page 7: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/7.jpg)
Автоматические тестирование
● честные unit tests● функциональные тесты в формате unit
tests○ тестируют поведение○ загружают IntelliJ Platform (без UI)○ время работы достаточно велико○ не меняются при изменении реализации
![Page 8: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/8.jpg)
Запуск тестов на TeamCity
● через Ant, Maven,...● через IntelliJ IDEA Project runner:
○ создать shared run configuration в IDEA○ положить соответствующий файл в VCS○ добавить название run configuration в настройках
IDEA Project runner
![Page 9: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/9.jpg)
Возможности TeamCity
● автоматический запуск тестов● просмотр результатов, история● назначение ответственного за падение
тестов● проверка изменений до коммита в VCS
(Remote Run)
![Page 10: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/10.jpg)
Установка плагина в IDE
● из репозитория plugins.jetbrains.com● с диска (Settings | Plugins | Install plugin
from disk)● из собственного репозитория
![Page 11: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/11.jpg)
Собственый репозиторий плагиновFile | Settings | Plugins | Browse Repositories | Manage Repositories,добавить ссылку на plugins.xml.
plugins.xml:<plugins><plugin id="samplePlugin" url="PluginZipFileUrl.zip" version="1.0"/>
</plugins>
![Page 12: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/12.jpg)
Архитектура IntelliJ Platform
Компоненты, сервисы, точки расширения
![Page 13: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/13.jpg)
Система компонентов
● экземпляры объектов хранятся в иерархии контейнеров PicoContainer
● иерархия состоит из трёх уровней○ Application○ Project○ Module
● регистрируются в plugin.xml
![Page 14: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/14.jpg)
Получение экземпляра компонента
● метод getInstance(), getInstance(project), getInstance(module)
● dependency injection через параметры конструктора (другие компоненты данного уровня или более высоких уровней)
![Page 15: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/15.jpg)
Компоненты● наследуются от ApplicationComponent,
ProjectComponent, ModuleComponent● регистрируются в <application-components>, <project-
components>,... в plugin.xml● загружаются при старте IDE (загрузке проекта,
загрузке модуля)
init use dispose
![Page 16: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/16.jpg)
● не накладывают ограничений на наследование
● регистрируются в <applicationService>, <projectService>, <moduleService>
● загружаются при первом обращении (ServiceManager.getService())
● если реализован интерфейс Disposable, метод dispose вызовется при закрытии IDE (проекта, модуля)
Сервисы
![Page 17: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/17.jpg)
Точки расширения
● регистрируются в <extensionPoints>● полное имя - <plugin id>.<extension name>● предполагают несколько реализаций● для доступа к расширениям создаётся
константа ExtensionPointName
![Page 18: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/18.jpg)
Точки расширения
● бывают двух видов:○ beanClass - дают возможность задавать
атрибуты расширения прямо в xml○ interface - в расширении указывается только
ссылка на класс, реализующий интерфейс● могут быть уровня проекта или модуля
(атрибут area), по умолчанию уровня application
![Page 19: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/19.jpg)
Расширения
● регистрируются в <extensions>○ для расширений вида beanClass заполняются
атрибуты○ для расширений вида interface указывается
полное имя класса в атрибуте implementation● загружаются при первом обращении
(ExtensionPointName.getExtensions())
![Page 20: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/20.jpg)
Плагины и их зависимости
![Page 21: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/21.jpg)
Plugin classpath
● jar файлы плагина (*.jar в директории ‘lib’)● jar файлы плагинов, от которых он
зависит● jar файлы IDEA (*.jar в директории
<IDEA_HOME>/lib )
![Page 22: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/22.jpg)
Зависимости плагина
Определяются через <depends> в plugin.xml
![Page 23: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/23.jpg)
Опциональные зависимости
Задаются тэгом<depends optional=”true”
config-file=”fileName.xml”>в plugin.xmlКомпоненты из файла fileName.xml загружаются только в случае, если указанный плагин доступен
![Page 24: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/24.jpg)
Работа с фреймворками
![Page 25: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/25.jpg)
Конфигурирование фреймворка
● конфигурирование не требуется● специальная библиотека (SDK)● на уровне модуля● на уровне проекта
![Page 26: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/26.jpg)
Фреймворк без конфигурации● не требуется явных действий “добавить фреймворк”● экшены (completion, inspections,...) определяют
наличие фреймворка по аннотациям, наличию класса в зависимостях модуля (JavaPsiFacade.findClass(...,module.getModuleWithDependenciesAndLibrariesScope()),...
![Page 27: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/27.jpg)
Фреймворк-библиотека
● задаётся при помощи LibraryType● можно хранить дополнительные
настройки прямо в библиотеке● настройки редактируются в библиотеке в
диалоге Project Structure
![Page 28: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/28.jpg)
Фреймворк в настройками в модуле
● задаётся при помощи Facet (extension FacetType)
● настройки редактируются в диалоге Project Structure
![Page 29: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/29.jpg)
Фреймворк с настройками в проекте
● настройки хранятся в project service● редактируются в диалоге Settings
(extension projectConfigurable)
![Page 30: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/30.jpg)
Подключение фреймворка
● extension frameworkSupport (класс FrameworkSupportProvider)
● опция появляется в диалоге “New Project/Module Wizard” и в диалоге “Add Framework Support” (popup menu в Project View)
![Page 31: Plugin development for intelli j platform](https://reader033.vdocument.in/reader033/viewer/2022052504/54b61b894a795971668b457a/html5/thumbnails/31.jpg)
Ссылки
Исходный код плагина с примерами:https://github.com/chashnikov/intellij-sample-plugin