你正在使用哪个版本的Go( go version
)?
$ go version
go version go1.15.6 linux/amd64
这个问题在最新版本中是否重现?
是的。
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN="/usr/local/go/bin/"
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/ua/go/pkg/mod"
GONOPROXY="github.ibm.com/*"
GONOSUMDB="github.ibm.com/*"
GOOS="linux"
GOPATH="/home/ua/go"
GOPRIVATE="github.ibm.com/*"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build393178232=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
我们有一个使用许多由多个团队开发的Golang插件的应用程序。它与Golang Dep非常兼容( https://github.com/golang/dep ),因为你不需要关心由插件的新包和供应商目录中的所有这些包引起的任何兼容性问题,因为它们都是独立的。
然而,当我们迁移到Go Modules时,会出现各种兼容性问题。对于大多数情况,我们需要细化共享项目,然后我们必须更改许多团队开发的插件。工作量很大。
尽管最后,我们可以通过各种方式解决这个问题,但成本太高,因此我们不得不回到Golang Dep。
你期望看到什么?
就像Golang Dep一样,如果我们能成功构建GoLang插件,那么我们就可以用主应用程序加载插件,所有插件都可以无缝协作,没有任何问题。
你看到了什么?
现在,当我们成功构建一个GoLang插件时,这并不意味着插件可以被加载,也不意味着它可以与其他插件一起工作。会出现各种各样的“不同版本的包”问题。
9条答案
按热度按时间1dkrff031#
这更像是问题或请求帮助,而不是一个错误报告,因为没有办法重现问题或任何指向可以修复的错误的明确细节。你看过$x_{1e0f1}^{x}$吗?
4sup72z82#
感谢@mvdan。
我不确定这是否只是一个问题,而不是一个bug。自从Go 1.14之后,GO Modules成为了唯一的依赖管理工具。虽然它对于构建通用的独立二进制文件很好,但是维护具有许多独立插件的应用程序需要付出很大的努力。
如果我们不关心这个努力,我们可以为新开发的插件解决所有的依赖问题。但这不是一个可持续的解决方案。当有一个新的插件开发出来时,我们可能需要修改主应用程序和所有其他100个插件。
例如,我们有一个共享的"库"项目:
go.mod
go.sum
很可能有一些新的插件使用上述"go.sum"中的不同包。这将导致一个问题,例如主二进制文件无法加载插件,因为它们使用了"不同的包版本",或者不同的插件无法一起工作。这个问题不仅仅是一个无法用新的修订配置解决的情况。问题在于我们可能需要升级主二进制文件和所有100多个现有插件,以适应新开发的插件。
根据Go 1.14发布说明中的声明在" https://golang.org/doc/go1.14 "处,我需要打开一个问题:
Module support in the go command is now ready for production use, and we encourage all users to migrate to Go modules for dependency management. If you are unable to migrate due to a problem in the Go toolchain, please ensure that the problem has an open issue filed. (If the issue is not on the Go1.15 milestone, please let us know why it prevents you from migrating so that we can prioritize it appropriately.)
1hdlvixo3#
这个与
dep
相比如何更好?在dep
中,您是否也需要保持版本之间的同步?还是它只是掩盖了问题,因为没有可用的版本信息?cwtwac6a4#
目前,dep对于我们的场景来说运行得非常好。我们有一个git仓库作为主要的"共享库"。它非常稳定,除非有大的升级(实际上,向"共享库"添加新包没有兼容性问题),否则我们不会更改所有包。主要的二进制代码和所有100多个插件都基于这个"共享库"。
"共享库"在其自己的供应商目录中有依赖包,就像所有插件一样。GoLang将不同供应商目录中的包视为不同的包。除非使用unsafe.Pointer(我们不建议使用它),否则不会进行转换。这是功能上的一个大限制。然而,优势要大得多。插件所有者(我们的团队和许多合作伙伴)不需要关心兼容性。只要能够构建,插件就可以始终正常运行。
我们需要GoLang提供类似于轻量级的Java OSGi的东西。
xiozqbni5#
相同的根本原因与#18827相同,但期望的结果在相反的方向。
46scxncf6#
我认为这也是对支持在主模块之外进行vendoring的请求。目前,
go mod
不支持它。https://golang.org/ref/mod#vendoring
与GOPATH中的vendoring不同,go命令忽略主模块根目录之外的其他位置的vendor目录。
2w3rbyxf7#
在共享工作空间下构建所有内容是否有帮助?
所有依赖项应在单个工作空间内解析为相同的版本。
slwdgvem8#
我们与合作伙伴没有共享的构建服务器,这是不可行的。
68de4m5k9#
如果你是在询问go workspaces,那么答案是否定的。插件有一个
main
模块,但是在加载插件时,你还需要一个main
模块,而且要加载插件的依赖项也需要版本兼容。插件拒绝构建并抱怨只想要一个主模块。