如何解决升级旧的 go 项目以使用 go 模块
我的 $GOPATH 包含 3 个位置
- /home//文档/gotree
- /home//Documents/perforce/modules/thirdparty/golibs
- /home//Documents/perforce/modules/sggolibs/
这里的位置 1 用于一般用途,2 和 3 用于与工作相关的库,它们在一个 perforce 服务器上维护。最后两个库会一直保留,以便公司中的任何人都应该使用这些确切的版本,而不是来自互联网的库的最新版本。
在其他位置有几个 go 服务器,并且所有服务器都使用至少一个来自 $GOPATH 位置 2 和 3 的库。
所有这些服务器都是 2,3 年前编写的,并且不包含任何 go.mod 或任何包管理项。
我的问题是如何将所有这些服务器升级到最新版本的 go 以便它可以与 go 模块一起使用,并且可能是第三方库的供应商目录?
如果我的问题太笼统,我深表歉意。
解决方法
不幸的是,Perforce 不是 go
命令中本机支持的 version control systems 之一,因此您可能需要应用一些脚本或工具,以便从 Perforce 存储库插入库.
一种选择是设置 module proxy 来提供来自 Perforce 的依赖项,并让您的开发人员设置 GOPROXY
和 GONOSUMDB
environment variables 以便他们使用该代理代替(或补充)默认值 (proxy.golang.org,direct
)。
请注意,Go 模块会计算并存储依赖项的校验和,因此如果您修改了任何第三方依赖项,请务必使用唯一版本字符串(或不同的模块路径!)提供任何修改,以免它们发生冲突具有不同内容的上游版本。 (我似乎记得 Athens 代理支持过滤和/或注入模块,尽管我不太熟悉它的功能或配置。)
我不知道今天有任何支持 Perforce 的 Go 模块代理实现,但您可以仔细检查 https://pkg.go.dev/search?q=%22module+proxy%22 以确保;至少,那里列出了许多您可以用作参考的实现。该协议有意非常简单,因此希望实现它不会是大量工作。
另一种选择——短期内工作量可能较少,但长期内工作量更多——是在每个模块中使用 replace
directives 将每个 Perforce 托管的依赖项的源代码替换为相应的文件系统路径。您可能可以编写一个小脚本来自动化该过程; go mod edit
命令旨在支持这种脚本。
替换模块需要有 go.mod
文件(以减少由于拼写造成的混淆),因此如果您选择这种方法,您可能需要在一个或多个 Perforce 目录中运行 go mod init
以创建它们。
使用上述任何一种方法,从第一方存储库中尽可能少的模块开始可能是最简单的:理想情况下,只有一个位于包树的根部。您可以在那里运行 go mod init
,然后设置您的 replace
指令和/或本地代理,然后运行 go mod tidy
以填充依赖关系图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。