升级旧的 go 项目以使用 go 模块
Upgrading old go project to work with go modules
我的 $GOPATH 包含 3 个位置
- /家//Documents/gotree
- /家//Documents/perforce/modules/thirdparty/golibs
- /家//Documents/perforce/modules/sggolibs/
此处位置 1 用于一般用途,2 和 3 用于与工作相关的库,这些库在一台 perforce 服务器上维护。最后两个库必须保留,以便公司中的任何人都应该使用这些确切的版本,而不是库从互联网上获得的最新版本。
在其他位置有几个 go 服务器,它们都至少使用 $GOPATH 位置 2 和 3 中的一个库。
所有这些服务器都是 2,3 年前编写的,不包含任何 go.mod 或任何包管理项目。
我的问题是如何将所有这些服务器升级到最新版本,以便它可以与 go 模块一起工作,并且可能是第三方库的供应商目录?
抱歉,如果我的问题太笼统。
不幸的是,Perforce 不是 go
命令中原生支持的 version control systems 之一,因此您可能需要应用一些脚本或工具才能从您的库中插入库Perforce 存储库。
一个选择是设置一个 module proxy to serve the dependencies from Perforce, and have your developers set the GOPROXY
and GONOSUMDB
environment variables 以便他们使用该代理而不是(或除此之外)默认值 (proxy.golang.org,direct
)。
请注意,Go 模块计算并存储依赖项的校验和,因此如果您修改了任何第三方依赖项,请务必使用唯一的版本字符串(或不同的模块路径!)提供任何修改,这样它们就不会不会与内容不同的上游版本发生冲突。 (我似乎记得 Athens 代理支持过滤 and/or 注入模块,虽然我不是很熟悉它的功能或配置。)
我不知道目前有任何支持 Perforce 的 Go 模块代理实现,但您可以仔细检查 https://pkg.go.dev/search?q=%22module+proxy%22 以确保;至少,那里列出了许多实现,您可以将其用作参考。该协议有意非常简单,因此希望实施它不会有大量工作。
另一种选择——可能在短期内效果不佳,但在长期内效果更好——是使用 replace
directives in each module to replace the source code for each Perforce-hosted dependency with the corresponding filesystem path. You could probably write a small script to automate that process; the go mod edit
命令来支持这种脚本。
替换模块需要有 go.mod
个文件(以减少拼写错误造成的混淆),因此如果您选择这种方法,您可能需要 运行 go mod init
一个或更多的 Perforce 目录来创建它们。
使用上述任何一种方法,从第一方存储库中尽可能少的模块开始可能是最简单的方法:理想情况下,只在包树的根目录中放置一个模块。你可以在那里 运行 go mod init
,然后设置你的 replace
指令 and/or 本地代理,然后 运行 go mod tidy
来填充依赖关系图。
我的 $GOPATH 包含 3 个位置
- /家//Documents/gotree
- /家//Documents/perforce/modules/thirdparty/golibs
- /家//Documents/perforce/modules/sggolibs/
此处位置 1 用于一般用途,2 和 3 用于与工作相关的库,这些库在一台 perforce 服务器上维护。最后两个库必须保留,以便公司中的任何人都应该使用这些确切的版本,而不是库从互联网上获得的最新版本。
在其他位置有几个 go 服务器,它们都至少使用 $GOPATH 位置 2 和 3 中的一个库。
所有这些服务器都是 2,3 年前编写的,不包含任何 go.mod 或任何包管理项目。
我的问题是如何将所有这些服务器升级到最新版本,以便它可以与 go 模块一起工作,并且可能是第三方库的供应商目录?
抱歉,如果我的问题太笼统。
不幸的是,Perforce 不是 go
命令中原生支持的 version control systems 之一,因此您可能需要应用一些脚本或工具才能从您的库中插入库Perforce 存储库。
一个选择是设置一个 module proxy to serve the dependencies from Perforce, and have your developers set the GOPROXY
and GONOSUMDB
environment variables 以便他们使用该代理而不是(或除此之外)默认值 (proxy.golang.org,direct
)。
请注意,Go 模块计算并存储依赖项的校验和,因此如果您修改了任何第三方依赖项,请务必使用唯一的版本字符串(或不同的模块路径!)提供任何修改,这样它们就不会不会与内容不同的上游版本发生冲突。 (我似乎记得 Athens 代理支持过滤 and/or 注入模块,虽然我不是很熟悉它的功能或配置。)
我不知道目前有任何支持 Perforce 的 Go 模块代理实现,但您可以仔细检查 https://pkg.go.dev/search?q=%22module+proxy%22 以确保;至少,那里列出了许多实现,您可以将其用作参考。该协议有意非常简单,因此希望实施它不会有大量工作。
另一种选择——可能在短期内效果不佳,但在长期内效果更好——是使用 replace
directives in each module to replace the source code for each Perforce-hosted dependency with the corresponding filesystem path. You could probably write a small script to automate that process; the go mod edit
命令来支持这种脚本。
替换模块需要有 go.mod
个文件(以减少拼写错误造成的混淆),因此如果您选择这种方法,您可能需要 运行 go mod init
一个或更多的 Perforce 目录来创建它们。
使用上述任何一种方法,从第一方存储库中尽可能少的模块开始可能是最简单的方法:理想情况下,只在包树的根目录中放置一个模块。你可以在那里 运行 go mod init
,然后设置你的 replace
指令 and/or 本地代理,然后 运行 go mod tidy
来填充依赖关系图。