1

我的 $GOPATH 包含 3 个位置

  1. /home//文档/gotree
  2. /home//Documents/perforce/modules/thirdparty/golibs
  3. /home//Documents/perforce/modules/sggolibs/

这里位置 1 用于一般用途,位置 2 和 3 用于与工作相关的库,它们在一台 perforce 服务器上维护。最后两个库保持有效,因此公司中的任何人都应该使用这些确切的版本,而不是该库从互联网上获取的最新版本。

在其他位置有几个 go 服务器,它们都使用至少一个来自 $GOPATH 位置 2 和 3 的库。

所有这些服务器都是 2,3 年前编写的,不包含任何 go.mod 或任何包管理项目。

我的问题是如何将所有这些服务器升级到最新版本的 go 以便它可以与 go 模块一起使用,并且可能是第三方库的供应商目录?

如果我的问题太笼统,请道歉。

4

1 回答 1

1

不幸的是,Perforce 不是命令中本机支持的版本控制系统go之一,因此您可能需要应用一些脚本或工具才能从 Perforce 存储库中插入库。


一种选择是设置一个模块代理来提供来自 Perforce 的依赖项,并让您的开发人员设置环境变量GOPROXYGONOSUMDB 环境变量,以便他们使用该代理而不是(或除了)默认值(proxy.golang.org,direct)。

请注意,Go 模块计算和存储依赖项的校验和,因此如果您修改了任何第三方依赖项,任何修改都必须使用唯一的版本字符串(或不同的模块路径!),这样它们就不会与上游版本冲突有不同的内容。(我似乎记得雅典代理支持过滤和/或注入模块,尽管我不太熟悉它的功能或配置。)

我不知道今天有任何支持 Perforce 的 Go 模块代理实现,但您可以仔细检查https://pkg.go.dev/search?q=%22module+proxy%22以确保;至少,那里列出了许多可以用作参考的实现。该协议故意非常简单,因此希望实现它不会是大量工作。


另一种选择——可能在短期内减少工作量,但在长期内增加工作量——是在每个模块中使用replace指令将每个 Perforce 托管依赖项的源代码替换为相应的文件系统路径。您可能可以编写一个小脚本来自动化该过程;该go mod edit命令旨在支持这种脚本。

替换模块需要有go.mod文件(以减少由于拼写错误造成的混乱),因此如果您选择这种方法,您可能需要go mod init在一个或多个 Perforce 目录中运行来创建它们。


使用上述任何一种方法,从第一方存储库中尽可能少的模块开始可能是最简单的:理想情况下,只有一个位于包树根的模块。您可以在go mod init那里运行,然后设置您的replace指令和/或本地代理,然后运行go mod tidy以填写依赖关系图。

于 2021-07-01T14:49:24.343 回答