Удалить исходный код хоста из плагина, чтобы уменьшить размер файла - PullRequest
0 голосов
/ 06 января 2019

Я сейчас экспериментирую с системой плагинов Голанга. Проблема, с которой я столкнулся при тестировании, заключается в том, что размер файлов плагинов относительно велик.

Приложение, загружающее плагин, будет упоминаться как "хост".

Размер самого хост-приложения составляет ~ 50 МБ, поскольку он является веб-приложением и должен быть расширен за счет функциональности плагина.

Я запустил небольшой загрузчик плагинов для запуска плагинов.

Плагины могут использовать уже существующие API в приложении, например, для доступа к базе данных.

Я подготовил пример плагина для этого вопроса. Размер файла плагина .so составляет ~ 39 МБ. Это дает мне обоснованное подозрение, что плагин также содержит исходный код из хост-приложения.

Команда, использованная для создания main.so:

go build -ldflags="-s -w" --buildmode=plugin main.go

Можно ли "удалить" дублированный исходный код из приложения, чтобы уменьшить размер файла, поскольку он уже загружен во время выполнения, когда загружается плагин?

Плагин-загрузчик: https://github.com/jonasfranz/gitea/blob/feature/plugin/modules/plugins/loader.go

Пример плагина: https://git.jonasfranz.software/JonasFranzDEV/giteaplugin

1 Ответ

0 голосов
/ 06 января 2019

Исходный код не включен в плагины. Но в них входит зависимость , рекурсивно . Это связано с тем, что нет гарантии, что основное приложение, загружающее плагин, также содержит зависимости, поэтому для обеспечения жизнеспособности плагина его зависимости должны быть автономными.

Это не вызывает проблем, если основное приложение также включает в себя те же зависимости (с той же версией), они будут "инстанцированы" только один раз во время выполнения go, подробнее см. Как работают зависимости плагина Go

Что делать, чтобы уменьшить размеры плагинов? Помимо удаления отладочной информации (что вы сделали), вы должны минимизировать зависимости.

Это может потребовать редизайна и серьезных изменений как в плагине, так и в приложении, для которого вы хотите создать плагин. Например, плагины не должны ссылаться на пакеты «реализации», плагины должны ссылаться только на пакеты «интерфейса». Если интерфейсы и реализации не разделены, это может оказаться невозможным (следовательно, может потребоваться также изменить основное приложение).

Вы также можете попробовать утилиты, которые пытаются сжать двоичные файлы, подробнее см. Сократите ваши двоичные файлы Go с помощью этого странного трюка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...