Перейти к содержимому

Сборка и развёртывание плагинов

[!note] Это руководство предполагает, что вы хотите собрать плагин для Notifly v2.0.0. Если вы хотите собрать для другой версии, замените v2.0.0 на желаемую версию.

Makefile notifly/plugin-template уже содержит задачи для большинства вещей, которые необходимо сделать при сборке плагина, вы можете скопировать Makefile в собственный проект плагина.

cd в каталог исходного кода плагина:

Окно терминала
$ cd /path/to/plugin/source
$ ls
main.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-образы 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}]. ([] означает опционально)

Окно терминала
$ 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 /proj
Окно терминала
$ 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 /proj
Окно терминала
$ 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 /proj
Окно терминала
$ 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

[!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 )
  • Если конфликтующий пакет является зависимостью сторонней (начинается с имени хоста, например: github.com/...):
    • Проверьте, актуален ли ваш файл проекта go.mod ( go mod tidy )
    • Плагин может иметь общую зависимость с notifly, но с другой версией, измените версию этой зависимости вручную в go.mod или используйте gomod-cap.
  • Если вы всё ещё не можете разрешить проблему зависимостей, попробуйте собрать notifly из исходного кода.