插件和主应用程序之间的Golang包版本

时间:2017-11-28 01:04:08

标签: go plugins

我不是Go专家,所以我可能会以一种不是Go的理想方式来做这件事。基本上,我有一个主应用程序,需要能够为它编写插件。插件都遵循给定的格式,并使用go build -buildmode=plugin构建。我不希望最终用户每次都需要重新编译主应用程序。理想情况下,您应该能够毫无问题地将其拖放到新计算机上。

要在插件和应用程序之间传递信息,我有一个名为“common”的第三个包,我认为它类似于C头文件。它只定义了接口和一些可以使用的整数常量。应用程序生成符合界面的类型,并可以将它们传递给插件以供使用。

当我编译时,它似乎工作正常,应用程序可以使用plugin.Open加载插件。尝试移动common包的位置时会出现问题。我在本地目录中构建了原始应用程序,我有一个安装应用程序的脚本,并将common包复制到GOPATH中,以便找到它。现在,当我尝试创建插件并编译它们引用common包的全局副本时,我无法在主应用程序中加载它们,因为它将包的两次出现视为不同版本。

我的理解是,为了确定包版本,在编译时对包中的所有Go文件进行散列。这个哈希是否包括服务器上找到包的位置?

我知道包的实际版本是相同的。唯一不同的是我做了cp -r src/myapp /usr/local/go/src。有没有比我的方法更好的方法来实现这一点,仍然允许用户将主应用程序移动到不同的机器而不需要重新编译它?

进一步解释:

这是我的目录结构

./
   |-- main.go 
   |-- src/myapp/common
   |      |-- Common.go
   |-- install.sh

将此编译为myapp后,我将src/myapp/common复制到GOPATH,然后针对该包构建go build -buildmode=plugin的插件。从myapp加载这些插件时,它会将myapp/common的两个版本视为不同,但唯一的区别是服务器上的位置。

1 个答案:

答案 0 :(得分:1)

您是否尝试过保持公共包的路径稳定?您可能应该在自己的仓库中拥有它(这样两个项目都可以引用它),或者将它保存在您的应用仓库中,但允许插件链接到那里。

例如,假设您的项目位于:

github.com/brianwest/myapp

你可以创建导入路径(适用于app和插件):

github.com/brianwest/myapp/src/common

OR

github.com/brianwest/common

并在应用程序和插件中保持稳定,然后它应该正常工作,你不需要脚本将其复制到gopath,或者如果你这样做,可以把它放在src / github.com / brianwest / common并在插件和应用程序中使用该路径。