从插件中删除主机的源代码以减小文件大小

时间:2019-01-06 17:59:38

标签: go plugins compilation

我目前正在尝试使用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

1 个答案:

答案 0 :(得分:2)

源代码未包含在插件中。但是其中包含的是它们的依赖性递归。之所以这样,是因为不能保证加载插件的主应用程序也包含依赖项,因此,要确保插件的生存能力,其依赖项必须是独立的。

如果主应用程序还包含相同的依赖项(具有相同的版本),则不会造成问题,它们仅会在go运行时中“实例化”一次,有关详细信息,请参见How do Go plugin dependencies work?

该怎么做才能减小插件的大小?除了删除调试信息(您做了什么)之外,您还应该使依赖性最小化。

这可能需要在插件或您要为其创建插件的应用程序中进行重新设计和重大更改。例如,插件不应引用“实现”软件包,插件应仅引用“接口”软件包。如果接口和实现未分开,则可能无法实现(因此可能也需要更改主应用程序)。

您还可以尝试尝试压缩二进制文件的实用程序,有关详细信息,请参见:Shrink your Go binaries with this one weird trick