Экспорт функций
Руководство по экспорту функций из вашего плагина для использования другими языковыми модулями в Plugify.
В экосистеме Plugify плагины на Go могут экспортировать функции, чтобы сделать их доступными для других плагинов. Это руководство объясняет, как определять и экспортировать функции в Go, и предоставляет примеры, которые помогут вам беспрепятственно интегрировать ваши плагины.
Базовое сопоставление типов
В следующей таблице перечислены способы представления типов в JavaScript API:
| Тип C++ | Тип Go | Псевдоним Plugify | Поддержка Ref? |
|---|---|---|---|
| void | void (not used in Go) | void | ❌ |
| bool | bool | bool | ✅ |
| char | byte | char8 | ✅ |
| char16_t | rune | char16 | ✅ |
| int8_t | int8 | int8 | ✅ |
| int16_t | int16 | int16 | ✅ |
| int32_t | int32 | int32 | ✅ |
| int64_t | int64 | int64 | ✅ |
| uint8_t | uint8 | uint8 | ✅ |
| uint16_t | uint16 | uint16 | ✅ |
| uint32_t | uint32 | uint32 | ✅ |
| uint64_t | uint64 | uint64 | ✅ |
| uintptr_t | uintptr | ptr64 | ✅ |
| uintptr_t | uintptr | ptr32 | ✅ |
| float | float32 | float | ✅ |
| double | float64 | double | ✅ |
| void* | unsafe.Pointer | function | ❌ |
| plg::string | string | string | ✅ |
| plg::any | any | any | ✅ |
| plg::vector<bool> | []bool | bool[] | ✅ |
| plg::vector<char> | []byte | char8[] | ✅ |
| plg::vector<char16_t> | []rune | char16[] | ✅ |
| plg::vector<int8_t> | []int8 | int8[] | ✅ |
| plg::vector<int16_t> | []int16 | int16[] | ✅ |
| plg::vector<int32_t> | []int32 | int32[] | ✅ |
| plg::vector<int64_t> | []int64 | int64[] | ✅ |
| plg::vector<uint8_t> | []uint8 | uint8[] | ✅ |
| plg::vector<uint16_t> | []uint16 | uint16[] | ✅ |
| plg::vector<uint32_t> | []uint32 | uint32[] | ✅ |
| plg::vector<uint64_t> | []uint64 | uint64[] | ✅ |
| plg::vector<uintptr_t> | []uintptr | ptr64[] | ✅ |
| plg::vector<uintptr_t> | []uintptr | ptr32[] | ✅ |
| plg::vector<float> | []float32 | float[] | ✅ |
| plg::vector<double> | []float64 | double[] | ✅ |
| plg::vector<plg::string> | []string | string[] | ✅ |
| plg::vector<plg::any> | []any | any[] | ✅ |
| plg::vector<plg::vec2> | []Vector2 | vec2[] | ✅ |
| plg::vector<plg::vec3> | []Vector3 | vec3[] | ✅ |
| plg::vector<plg::vec4> | []Vector4 | vec4[] | ✅ |
| plg::vector<plg::mat4x4> | []Matrix4x4 | mat4x4[] | ✅ |
| plg::vec2 | Vector2 | vec2 | ✅ |
| plg::vec3 | Vector3 | vec3 | ✅ |
| plg::vec4 | Vector4 | vec4 | ✅ |
| plg::mat4x4 | Matrix4x4 | mat4x4 | ✅ |
Экспорт функций в Go
Экспорт функций в Go требует пометки функций для экспорта с помощью директивы //plugify:export. Эти функции затем могут быть вызваны другими плагинами. Языковой модуль Go от Plugify позаботится обо всем остальном.
Использование генератора для упрощения экспорта функций
Инструмент generator.go упрощает процесс экспорта функций Go путем:
- Сканирования папки плагина: Он сканирует корневую папку вашего плагина для поиска функций с атрибутом
//plugify:export. - Создания манифеста: Он создает файл манифеста
.ppluginдля экспорта сигнатур функций другим плагинам. - Генерации файлов: Он генерирует файлы
autoexport.goиautoexport.hс необходимым кодом для экспорта функций.
Этот инструмент устраняет необходимость в ручном маршалинге, облегчая разработчикам интеграцию их плагинов на Go в экосистему Plugify.
Простой пример
Вот простой пример экспорта функции в плагине на Go:
Определение функции
Манифест плагина
Чтобы экспортировать функцию, опишите ее в манифесте плагина в разделе methods:
Сгенерированный код
Запустите инструмент generator.go для генерации файлов autoexport.go и autoexport.h. Эти файлы будут обрабатывать маршалинг типов Plugify в типы Go.
Этот сгенерированный код обрабатывает преобразование типов Plugify в типы Go и гарантирует, что функция может быть вызвана из других плагинов.
Сложный пример: Экспорт сложных функций
Вот пример экспорта функции со сложными типами параметров и возвращаемого значения:
Определение функции
Манифест плагина
Сгенерированный код
Запустите инструмент generator.go для генерации файлов autoexport.go и autoexport.h. Эти файлы будут обрабатывать маршалинг типов Plugify в типы Go.
Этот сгенерированный код обрабатывает преобразование типов Plugify в типы Go и гарантирует, что функция может быть вызвана из других плагинов.
Обработка обратных вызовов (Callbacks)
Plugify позволяет экспортировать функции, которые принимают обратные вызовы в качестве параметров. Вот пример:
Определение функции
Манифест плагина
Сгенерированный код
Запустите инструмент generator.go для генерации файлов autoexport.go и autoexport.h. Эти файлы будут обрабатывать маршалинг типов Plugify в типы Go.
Этот сгенерированный код обрабатывает преобразование типов Plugify в типы Go и гарантирует, что функция может быть вызвана из других плагинов.
Автоматизация генерации манифеста и экспорта
Новое: Теперь вы можете автоматизировать генерацию как манифеста плагина, так и кода экспорта с помощью генератора Go из go-plugify!
Вместо ручного написания JSON манифеста и кода экспорта, вы можете пометить свои функции комментариями //plugify:export ИмяФункции. Генератор проанализирует весь ваш Go проект и автоматически сгенерирует:
- Манифест плагина (файл
.pplugin) со всеми экспортируемыми методами - Файлы автоэкспорта (
autoexport.goиautoexport.h) с кодом маршалинга
Преимущества автоматической генерации
- Нет ручного написания JSON: Сигнатуры функций автоматически извлекаются из вашего кода
- Полная информация о типах: Типы параметров и возвращаемых значений автоматически сопоставляются
- Автоматический маршалинг: Обертки экспорта с правильным преобразованием типов генерируются автоматически
- Меньше ошибок: Устраняются опечатки и несоответствия типов между кодом и манифестом
- Простота обслуживания: Изменения в сигнатурах функций автоматически отражаются
Настройка: Создание вашего генератора
Поскольку генератор является частью пакета go-plugify, но не может быть запущен напрямую как зависимость, вам нужно создать собственный файл generator.go, который вызывает функцию plugify.Generate().
Создайте файл generator.go в корне вашего проекта:
Использование комментария //plugify:export
Пометьте ваши экспортируемые функции директивой комментария //plugify:export ИмяФункции:
Запуск генератора
Запустите генератор с помощью команды go generate:
Или запустите его вручную:
Как это работает
- Во время генерации: Парсер Go анализирует весь ваш проект в поисках комментариев
//plugify:export - Анализ типов: Он извлекает сигнатуры функций и сопоставляет типы Go с типами Plugify (например,
int32→int32,[]string→string[]) - Генерация манифеста: Создается файл
.ppluginсо всеми экспортируемыми методами - Генерация кода экспорта: Генерируются файлы
autoexport.goиautoexport.hс правильным кодом маршалинга
Лучшие практики
- Используйте
//plugify:export: Помечайте функции для автоматической генерации с помощью директивы комментария//plugify:export ИмяФункции. - Создайте файл генератора: Настройте собственный файл
generator.go, который вызываетplugify.Generate()для автоматической генерации манифеста и экспорта. - Соблюдайте соглашения о типах: Придерживайтесь соглашений о типах Plugify для параметров и возвращаемых значений.
- Документируйте ваши функции: Используйте комментарии Go doc для четкого документирования назначения, параметров и возвращаемых значений экспортируемых функций.
- Используйте
go generate: Запускайтеgo generateдля автоматической перегенерации манифеста и файлов экспорта после внесения изменений. - Тестируйте тщательно: Тестируйте ваши экспортированные функции, чтобы убедиться, что они работают так, как ожидается, при вызове из других плагинов.
- Поддерживайте синхронизацию сгенерированных файлов: Перегенерируйте файлы после любых изменений в сигнатурах функций для поддержания консистентности.
Заключение
Экспорт функций в плагинах на Go упрощен благодаря новому автоматическому генератору из go-plugify. Помечая свои функции комментариями //plugify:export и запуская go generate, вы можете автоматически сгенерировать как манифест плагина, так и код экспорта с правильным маршалингом типов. Это устраняет ручное написание JSON и уменьшает количество ошибок, облегчая создание надежных и совместимых плагинов. Генератор анализирует весь ваш Go проект с помощью парсера Go, извлекая сигнатуры функций и автоматически генерируя все необходимые файлы. Для более сложных случаев, таких как обработка обратных вызовов, генератор обрабатывает сложный код маршалинга за вас.