我目前正在尝试使用golang的插件系统。我在测试中遇到的一个问题是,插件的文件大小相对较大。
加载插件的应用程序将被称为“主机”。
主机应用程序本身约为50MiB,因为它是一个Web应用程序,应使用插件功能进行扩展。
我已经实现了一个小的插件加载器来启动插件。
插件可以使用应用程序中已经存在的API,例如访问数据库。
我已经为这个问题准备了一个示例插件。插件.so文件大小为〜39MiB。这使我有一个合理的怀疑,即该插件还包含来自主机应用程序的源代码。
用于创建的命令main.so:
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
插件中不包含源代码。但什么是包含在他们的是他们的 依赖性 , 递归 。之所以这样,是因为不能保证加载插件的主应用程序也包含依赖项,因此,要确保插件的生存能力,其依赖项必须是自包含的。
如果主应用程序还包含相同的依赖项(具有相同的版本),这不会引起问题,它们只会在go运行时中“实例化”一次
为了减小插件的尺寸怎么办?除了删除调试信息(您做了什么)之外,您还应该最小化依赖性。
这可能需要在插件或您要为其创建插件的应用程序中进行重新设计和重大更改。例如,插件不应引用“实现”软件包,插件应仅引用“接口”软件包。如果接口和实现未分开,则可能无法实现(因此也可能需要更改主应用程序)。
您也可以尝试尝试压缩二进制文件的实用程序,有关详细信息,请参见:使用这一奇怪的技巧缩小Go二进制文件