我目前正在试用golang的插件系统。我在测试中遇到的一个问题是插件的文件大小相对较大。
加载插件的应用程序将被引用为"主机"。
主机应用程序本身大约50MiB大,因为它是一个web应用程序,应该使用插件功能进行扩展。
我已经实现了一个小型插件加载程序来启动插件。
插件可以使用应用程序中已经存在的API来访问数据库。
我为这个问题准备了一个插件示例。插件.so文件大小约为39MiB。这让我有理由怀疑该插件还包含来自主机应用程序的源代码。
用于创建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插件依赖项如何工作?
如何减少插件的大小?除了删除调试信息(您所做的)之外,还应该最小化依赖关系。
这可能需要对插件或您希望创建插件的应用程序进行重新设计和重大更改。例如,插件不应该引用"实现"包,插件应该只引用"接口"包。如果接口和实现没有分开,这可能是不可能的(因此可能也需要更改主应用程序)。
你也可以尝试压缩二进制文件的实用程序,有关详细信息,请参阅:用这个奇怪的技巧缩小你的Go二进制文件