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

插件和主应用程序之间的Golang包版本,go,plugins,Go,Plugins,我不是围棋专家,所以我可能不是围棋的理想方法。本质上,我有一个主应用程序,需要能够为它编写插件。这些插件都遵循给定的格式,并使用go build-buildmode=plugin构建。我不希望最终用户每次都需要重新编译主应用程序。理想情况下,您应该能够将其拖放到新计算机上而不会出现问题 为了在插件和应用程序之间传递信息,我定义了第三个名为“common”的包,我将其视为类似于C头文件。它只定义了两个都可以使用的接口和几个整数常量。应用程序生成的类型与接口保持一致,并可以将它们传递给插件使用 当我

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

为了在插件和应用程序之间传递信息,我定义了第三个名为“common”的包,我将其视为类似于C头文件。它只定义了两个都可以使用的接口和几个整数常量。应用程序生成的类型与接口保持一致,并可以将它们传递给插件使用

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

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

我知道,软件包的实际版本是相同的。唯一不同的是我做了
cp-rsrc/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
的两个版本不同,尽管唯一的区别是服务器上的位置。

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

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

github.com/brianwest/myapp

您可以创建导入路径(应用程序和插件):

github.com/brianwest/myapp/src/common

github.com/brianwest/common


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

好的,正确的方法是将公共包分离成一个单独的项目,然后两者都引用那个独立的项目?这是有道理的。如果它后来被移动到一台新机器上,它是否仍能在原始机器上编译主应用程序时正常工作?是的,想法是将公共包保持在一个稳定的导入url-go将不同的url视为不同的包。因此,解决这个问题,它应该会工作得很好。如果是一个单独的项目,你可以称之为插件或类似的东西,并使其支持插件的功能,以及解释如何建立一个自述。明白了!我试过了,它似乎解决了我的问题。非常感谢。