Сборка и развёртывание плагинов
[!note] Это руководство предполагает, что вы хотите собрать плагин для Notifly
v2.0.0. Если вы хотите собрать для другой версии, замените v2.0.0 на желаемую версию.
Makefile notifly/plugin-template уже содержит задачи для большинства вещей, которые необходимо сделать при сборке плагина, вы можете скопировать Makefile в собственный проект плагина.
cd в каталог исходного кода плагина:
$ cd /path/to/plugin/source$ lsmain.go go.mod go.sum(Опционально) Убедитесь, что нет конфликтующих зависимостей:
Получите файл go.mod из Notifly. github.com/Notifly/blob/v2.0.0/go.mod и выполните следующую команду:
$ go get -u github.com/notifly/plugin-api/cmd/gomod-cap$ go run github.com/notifly/plugin-api/cmd/gomod-cap \ -from /path/to/Notifly/source/go.mod -to /path/to/plugin/source/go.mod$ go mod tidyС Docker (рекомендуется)
Заголовок раздела «С Docker (рекомендуется)»Docker-образы notifly/build используются для сборки Notifly. Рекомендуется использовать ту же среду сборки для плагинов, чтобы гарантировать совместимость.
Если вы не хотите использовать Makefile notifly/plugin-template то вы можете собрать плагин следующим образом:
Получите версию Go, которая использовалась для сборки Notifly. Версию можно найти в репозитории Notifly
в файле с именем GO_VERSION. github.com/Notifly/blob/v2.0.0/GO_VERSION.
В этом случае это 1.12.0.
Запустите docker-образы. Теги docker-образа notifly/build имеют следующий формат:
notifly/build:{GO_VERSION}-{GOOS}-{GOARCH}[-{GOARM}]. ([] означает опционально)
linux amd64
Заголовок раздела «linux amd64»$ docker run --rm -v "$PWD/.:/proj" -w /proj notifly/build:1.12.0-linux-amd64 \ go build -a -installsuffix cgo -ldflags "-w -s" -buildmode=plugin -o yourplugin-amd64.so /projlinux arm-7
Заголовок раздела «linux arm-7»$ docker run --rm -v "$PWD/.:/proj" -w /proj notifly/build:1.12.0-linux-arm-7 \ go build -a -installsuffix cgo -ldflags "-w -s" -buildmode=plugin -o yourplugin-arm-7.so /projlinux arm64
Заголовок раздела «linux arm64»$ docker run --rm -v "$PWD/.:/proj" -w /proj notifly/build:1.12.0-linux-arm64 \ go build -a -installsuffix cgo -ldflags "-w -s" -buildmode=plugin -o yourplugin-arm64.so /projlinux 386
Заголовок раздела «linux 386»$ docker run --rm -v "$PWD/.:/proj" -w /proj notifly/build:1.12.0-linux-386 \ go build -a -installsuffix cgo -ldflags "-w -s" -buildmode=plugin -o yourplugin-386.so /projБез Docker (не рекомендуется)
Заголовок раздела «Без Docker (не рекомендуется)»[!note] Плагины, собранные без среды сборки Notifly, вероятно, не будут работать с собранными двоичными файлами из релизов Notifly.
Установите версию Go, которая использовалась для сборки Notifly. Версию можно найти в репозитории Notifly
в файле с именем GO_VERSION. github.com/Notifly/blob/v2.0.0/GO_VERSION.
Если вы находитесь в GOPATH, явно включите go modules:
$ export GO111MODULE=onСоберите плагин:
$ go build -o /path/to/notifly/plugin/dir/myplugin.so -buildmode=pluginРазвёртывание
Заголовок раздела «Развёртывание»Notifly загружает плагины из каталога pluginsdir в конфигурации. Все файлы в этом каталоге загружаются как плагины.
Скопируйте собранный объект общей библиотеки в каталог плагинов notifly:
$ cp myplugin.so "${NOTIFLY_PLUGINSDIR}/myplugin.so"Запустите notifly:
$ notiflyДиагностика проблем
Заголовок раздела «Диагностика проблем»cannot load plugin (<plugin_filename>): package (<plugin_package>) was built with another version of package(<conflicting_package>)
Заголовок раздела «cannot load plugin (<plugin_filename>): package (<plugin_package>) was built with another version of package(<conflicting_package>)»- Если конфликтующий пакет находится в стандартной библиотеке (не начинается с имени хоста):
- Проверьте, собран ли плагин с включёнными go modules ( попробуйте
GO111MODULE=on) - Если вы используете официальный релиз, плагин должен быть собран с той же версией цепочки инструментов go, как среда сборки (
go version)
- Проверьте, собран ли плагин с включёнными go modules ( попробуйте
- Если конфликтующий пакет является зависимостью сторонней (начинается с имени хоста, например:
github.com/...):- Проверьте, актуален ли ваш файл проекта
go.mod(go mod tidy) - Плагин может иметь общую зависимость с notifly, но с другой версией, измените версию этой зависимости вручную в
go.modили используйте gomod-cap.
- Проверьте, актуален ли ваш файл проекта
- Если вы всё ещё не можете разрешить проблему зависимостей, попробуйте собрать notifly из исходного кода.