我不是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
的两个版本视为不同,但唯一的区别是服务器上的位置。
答案 0 :(得分:1)
您是否尝试过保持公共包的路径稳定?您可能应该在自己的仓库中拥有它(这样两个项目都可以引用它),或者将它保存在您的应用仓库中,但允许插件链接到那里。
例如,假设您的项目位于:
github.com/brianwest/myapp
你可以创建导入路径(适用于app和插件):
github.com/brianwest/myapp/src/common
OR
github.com/brianwest/common
并在应用程序和插件中保持稳定,然后它应该正常工作,你不需要脚本将其复制到gopath,或者如果你这样做,可以把它放在src / github.com / brianwest / common并在插件和应用程序中使用该路径。