【问题标题】:plugin was built with a different version of package插件是用不同版本的包构建的
【发布时间】:2019-04-25 02:51:32
【问题描述】:

VM1 和 VM2 都有 1.11.1 版本。

我的场景:

VM1:

main.go

package main

func startGin() *gin.Engine {
    gin.SetMode(gin.ReleaseMode)
    router := gin.New()
    v1:= router.Group("/v1")

    all_plugins, err := filepath.Glob("plugins/*.so")
    if err != nil {
       panic(err)
    }

    for _, filename := range all_plugins {
        p, err := plugin.Open(filename)
        if err != nil {
            panic(err)
       }
       handler, err := p.Lookup("Handler")
       if err != nil {
           panic(err)
       }
       v1.GET("/sample", handler.(func() gin.HandlerFunc)())
    }
    return router
}

func main() {
    router := startGin()
    server := &http.Server{Handler: router}
    ln, err := net.Listen("tcp4", ":8080")
    if err != nil {
        log.Error.Printf("error during startup", err)
    }
    server.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}

去构建 main.go

虚拟机2:

plugin.go

package main

import (
 "fmt"
 "github.com/gin-gonic/gin"
)

func Handler() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.JSON(200, "Success")
    }
}

去构建 -buildmode=plugin plugin.go

Getting Error "插件是用不同版本的包构建的

【问题讨论】:

  • 您收到该错误是有原因的。尝试删除插件并重建它们。还要确保如果他们在你的主应用中使用“共享”包,它们也必须匹配!
  • 是的,我有共享包,即 Go-Gin。那么我必须做些什么才能让它发挥作用呢?
  • 您必须使用相同版本的共享包。例如。如果您获得共享包,则构建插件,然后更新共享包并构建主应用程序,这将导致您看到的错误。每当共享包发生变化时,您都必须重新构建插件和主应用程序。
  • 共享包也有相同的版本并重建。但还是同样的问题
  • 您是否有机会出售这些软件包?供应商包与非供应商包不同,即使来源完全匹配。

标签: go go-gin


【解决方案1】:

我有类似的问题。我发现即使使用相同版本的 Golang 和相同的包,它们也可能无法一起工作并发出“插件是用不同版本的包构建的”的消息。这是因为主应用的构建机器和插件的构建机器具有不同的环境变量“GOPATH”,这会影响哈希来识别包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多