Создание языкового модуля
Руководство по расширению Plugify новыми языками.
Это руководство проведет вас через процесс создания вашего первого языкового модуля для системы Plugify. Языковой модуль позволяет Plugify поддерживать плагины, написанные на определенном языке программирования. Следуя этому руководству, вы научитесь определять файл конфигурации, реализовывать необходимый интерфейс и интегрировать ваш модуль с ядром Plugify.
Быстрый старт
Введение
Языковой модуль в Plugify - это динамическая библиотека, которая обеспечивает поддержку определенного языка программирования. Каждый языковой модуль должен включать файл конфигурации с именем .pmodule, который содержит метаданные и настройки, необходимые ядру Plugify для загрузки и управления модулем.
Манифест модуля
Файл .pmodule - это файл конфигурации в формате JSON, который определяет основную информацию о вашем языковом модуле. Ниже приведен пример файла .pmodule:
Объяснение опций конфигурации
version: Семантическая версия языкового модуля.name: Удобное для пользователя имя языкового модуля.language: Язык программирования, поддерживаемый модулем (например, "cpp" для C++).description: Краткое описание функциональности модуля.author: Автор или организация, создавшая модуль.website: URL-адрес, ссылающийся на профиль или веб-сайт создателя.license: Лицензия модуля.platforms: Список платформ, поддерживаемых модулем (например, Windows, Linux).
Реализация интерфейса ILanguageModule
Интерфейс ILanguageModule определяет методы, которые должен реализовать ваш языковой модуль. Ниже приведен обзор интерфейса:
Ключевые методы
Initialize: Вызывается при загрузке модуля. Используйте для настройки вашего модуля.Shutdown: Вызывается при выгрузке модуля. Используйте для очистки ресурсов.OnUpdate: Вызывается при обновлении модуля. Используйте для периодических обновлений.OnPluginLoad: Вызывается при загрузке плагина. Используйте для инициализации плагина.OnPluginStart: Вызывается при запуске плагина.OnPluginUpdate: Вызывается при обновлении плагина.OnPluginEnd: Вызывается при завершении работы плагина.OnMethodExport: Вызывается, когда плагин экспортирует методы для межплагинного взаимодействия.IsDebugBuild: Возвращаетtrue, если модуль собран в режиме отладки.
Шаги по созданию вашего первого языкового модуля
Настройте вашу среду разработки
Убедитесь, что у вас установлены следующие инструменты:
- Текстовый редактор или IDE (например, Visual Studio, CLion).
- Совместимый компилятор C++ (например, MSVC, GCC, Clang).
- Установленный и настроенный фреймворк Plugify.
Используйте шаблонный проект
Чтобы упростить процесс, клонируйте репозиторий template-lang-module:
Настройте и соберите шаблон
- Перейдите в каталог проекта:
- Сгенерируйте файлы сборки:
- Соберите проект:
Определите функциональность вашего модуля
- Реализуйте интерфейс
ILanguageModuleв вашем модуле. - Добавьте логику для загрузки, управления и выполнения плагинов на вашем целевом языке.
- Используйте библиотеку
plugify-functionдля динамической генерации функций C, если это необходимо.
Реализуйте функциональность маршалинга (при необходимости)
Для языков, требующих преобразования типов, реализуйте обертки для маршалинга, чтобы преобразовывать типы Plugify (например, plg::vector, plg::string) в нативные типы.
Создайте манифест модуля
Файл .pmodule - это файл конфигурации в формате JSON, который определяет основную информацию о вашем языковом модуле. Шаблонный проект уже включает файл .pmodule, поэтому вам нужно только изменить его в соответствии с вашим модулем.
Ключевые поля для обновления
language: Укажите язык программирования, который поддерживает ваш модуль (например,cpp,python,javascript).name: Укажите удобное для пользователя имя вашего модуля.description: Добавьте краткое описание функциональности вашего модуля.
Пример файла манифеста
Вот пример файла .pmodule для языкового модуля C++:
Как изменить шаблон
- Откройте файл
.pmoduleв вашем шаблонном проекте. - Обновите поле
language, чтобы указать язык программирования, который поддерживает ваш модуль. - Измените поля
name,descriptionи другие по мере необходимости.
Структура файлов для ZIP-архива
ZIP-архив для менеджера пакетов должен содержать следующие файлы в этой структуре:
- bin/
- template_language_module.dll
- libtemplate_language_module.so
- template_language_module.pplugin
bin/: Этот каталог должен содержать скомпилированные бинарные файлы вашего языкового модуля (например,.dllдля Windows и.soдля Linux).template_language_module.pplugin: Это файл манифеста плагина, который описывает ваш языковой модуль.
Протестируйте ваш модуль
Чтобы правильно протестировать ваш языковой модуль, вам необходимо создать cross_call_worker и использовать его вместе с cross_call_master для проверки правильности маршалинга всех функций. Это гарантирует, что ваш модуль может обрабатывать межплагинное взаимодействие и обмен данными.
Тестирование с межплагинным взаимодействием
- Создайте cross_call_worker: Реализуйте плагин, который экспортирует методы для вызова из
cross_call_master. Этот плагин должен обрабатывать обмен данными и вызовы методов. - Используйте cross_call_master:
cross_call_masterбудет вызывать методы из вашегоcross_call_workerи проверять, что данные правильно маршалируются и обрабатываются. - Проверьте пример на C++: Для рабочего примера обратитесь к репозиторию
cpp-language-module, который включает полностью реализованныеcross_call_workerиcross_call_masterдля тестирования.
Пример рабочего процесса
cross_call_masterвызывает метод изcross_call_workerдля передачи строки.cross_call_workerобрабатывает строку и вызывает метод обратно вcross_call_master, чтобы вернуть измененную строку.- Убедитесь, что строка была правильно передана и возвращена.
Опубликуйте ваш модуль
Загрузите пакет вашего модуля на хостинг (например, GitHub Releases) и поделитесь им с сообществом Plugify. Чтобы упростить процесс выпуска, вы можете использовать GitHub Actions для автоматического создания релизов, генерации JSON-файлов репозитория и обработки сборок для конкретных платформ.
Использование GitHub Actions для релизов
Наша команда реализовала рабочие процессы GitHub Actions в существующих языковых модулях (например, cpp-language-module) для автоматизации процесса выпуска. Эти рабочие процессы могут служить хорошим примером для настройки вашего собственного автоматизированного конвейера выпуска.
Ключевые особенности рабочего процесса
- Автоматические релизы:
- При пуше нового тега (например,
1.0.0) рабочий процесс автоматически создает релиз на GitHub. - Релиз включает скомпилированные файлы модуля и манифест
.pmodule.
- При пуше нового тега (например,
- Генерация JSON репозитория:
- Рабочий процесс генерирует JSON-файл репозитория (например,
repository.json), который содержит метаданные о релизе. - Этот файл используется менеджером пакетов Mamba для проверки обновлений.
- Рабочий процесс генерирует JSON-файл репозитория (например,
- Сборки для конкретных платформ:
- Рабочий процесс собирает модуль для нескольких платформ (например, Windows, Linux) и включает специфичные для платформы бинарные файлы в релиз.
- Проверка контрольных сумм:
- Рабочий процесс вычисляет контрольные суммы для артефактов релиза для обеспечения целостности файлов.
- Развертывание на GitHub Pages:
- JSON-файл репозитория развертывается на GitHub Pages, делая его доступным для менеджера пакетов Mamba.
- Уведомления в Discord:
- Рабочий процесс отправляет уведомление в канал Discord при публикации нового релиза.
Пример рабочего процесса
Вот пример рабочего процесса GitHub Actions для автоматизации релизов:
Как использовать
- Скопируйте файл рабочего процесса (например,
.github/workflows/release.yml) из одного из наших существующих языковых модулей (например,cpp-language-module). - Измените рабочий процесс в соответствии с процессом сборки и структурой файлов вашего модуля.
- Отправьте файл рабочего процесса в ваш репозиторий и создайте новый тег (например,
1.0.0), чтобы запустить процесс выпуска.
Используя GitHub Actions, вы можете автоматизировать процесс выпуска и гарантировать, что ваш модуль всегда будет актуальным и легко доступным для пользователей.
Поддерживайте и обновляйте ваш модуль
- Обновляйте
versionи другие поля в вашем файле.pmoduleдля каждого релиза.
Рекомендации
- Минимизируйте зависимости: Избегайте ненужных зависимостей для обеспечения совместимости и производительности.
- Используйте отладочные сборки для тестирования: Тестируйте ваш модуль в режиме отладки, чтобы выявлять проблемы на ранней стадии.
- Документируйте ваш модуль: Предоставляйте четкую документацию для пользователей и разработчиков.
- Следуйте семантическому версионированию: Используйте семантическое версионирование (например,
1.0.0) для релизов вашего модуля.
Устранение неполадок
- Модуль не загружается: Убедитесь, что файл
.pmoduleправильно отформатирован и размещен в правильном каталоге. - Плагины не инициализируются: Проверьте логи на наличие ошибок и убедитесь, что ваш модуль реализует все необходимые методы.
- Советы по отладке: Используйте подробное логирование и отладчик для выявления и устранения проблем.