gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:32 27 4
gpt4 key购买 nike

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

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

当我编译时,它似乎工作正常,应用程序可以使用 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 的两个版本是不同的,尽管唯一的区别是在服务器上的位置。

最佳答案

您是否尝试过保持通用包的路径稳定?您可能应该将它放在自己的存储库中(以便两个项目都可以引用它),或者将其保留在您的应用程序存储库中,但允许插件在那里链接到它。

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

github.com/brianwest/myapp

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

github.com/brianwest/myapp/src/common

github.com/brianwest/common

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

关于插件和主应用程序之间的 Golang 包版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com