我的$GOPATH包含3个位置
在这里,位置1用于一般用途,位置2和3用于与工作相关的库,这些库是在一个perforce服务器上维护的。这最后两个图书馆是绝对保持这样的任何人在公司应该使用这些确切的版本,而不是图书馆的最新版本的互联网。
在其他位置,有几台go服务器,它们都在使用来自$GOPATH location 2和3的至少一个库。
所有这些服务器都是2,3年前编写的,不包含任何go.mod或任何包管理项。
我的问题是如何将所有这些服务器升级到最新版本go,以便它能够与go模块一起工作,并可能将供应商目录升级到第三方库?
如果我的问题太笼统的话,很抱歉。
发布于 2021-07-01 14:49:24
不幸的是,Perforce不是go命令中本机支持的go之一,因此您可能需要应用一些脚本或工具,以便从Perforce存储库中插入库。
一种选择是设置一个模块代理以服务于Perforce的依赖项,并让您的开发人员设置GOPROXY和GONOSUMDB 环境变量,以便他们使用该代理而不是(或除了)默认值(proxy.golang.org,direct)。
请注意,Go模块计算和存储依赖项的校验和,因此,如果您修改了任何第三方依赖项,那么任何修改都必须使用唯一的版本字符串(或不同的模块路径!)这样它们就不会与内容不同的上游版本发生冲突。(我似乎还记得,阿森斯代理支持过滤和/或注入模块,尽管我不太熟悉它的功能或配置。)
我现在还不知道支持Perforce的Go模块代理实现,但是您可能会反复检查https://pkg.go.dev/search?q=%22module+proxy%22以确定;至少有一些可以用作参考的实现。该协议有意地非常简单,因此希望实现它不会有很大的工作量。
另一种选择--短期内工作可能较少,但长期而言更多--是在每个模块中使用指令来替换每个Perforce托管的依赖项的源代码,并使用相应的文件系统路径。您可能可以编写一个小脚本来自动化该过程;go mod edit命令旨在支持这种脚本。
替换模块需要有go.mod文件(以减少由于键入而造成的混乱),因此,如果您选择这种方法,您可能需要在一个或多个Perforce目录中运行go mod init来创建它们。
使用上述两种方法之一,最简单的方法可能是在您的第一个存储库中尽可能少地使用模块:理想情况下,只在包树的根处启动一个模块。您可以在那里运行go mod init,然后设置您的replace指令和/或本地代理,然后运行go mod tidy来填充依赖关系图。
https://stackoverflow.com/questions/68204832
复制相似问题