首页 > 解决方案 > 测试时Golang“插件是用不同版本的包构建的”

问题描述

我正在开发一个在启动时构建插件的项目:

func BuildPlugin(path *string) error {
    buildGo := "go"
    buildArgs := []string{
        "build",
        "-buildmode=plugin",
        "-o",
        filepath.Join(*path, "ext/ext.so"),
        filepath.Join(*path, "ext/ext.go"),
    }

    cmd := exec.Command(buildGo, buildArgs...)
    _, err := cmd.Output()

    if err != nil {
        return err
    }

    return nil
}

当我运行程序时,插件加载成功,但是当我运行测试时,出现以下错误:

fsm_test.go:34: plugin.Open("../examples/00_test/ext/ext"): plugin was built with a different version of package github.com/jaimeteb/chatto/fsm

我已经阅读了一些针对类似问题的解决方案,但还没有一个有效。

这是有问题的项目:github.com/jaimeteb/chatto

标签: goplugins

解决方案


Go 插件非常漂亮,但它们最大的缺点是构建插件和消费者二进制文件的 Go 版本必须完全匹配。这确实是让我无法更频繁地使用它们的最大原因,而是选择了基于 RPC 的插件库,例如hashicorp/go-plugin.

如果您选择继续使用 Go 插件,则无论何时更改 Go 的版本,甚至可能在构建您的消费项目时,都需要重新构建项目的插件。


推荐阅读