【问题标题】:Upgrading old go project to work with go modules升级旧的 go 项目以使用 go 模块
【发布时间】:2021-07-01 22:49:24
【问题描述】:

我的 $GOPATH 包含 3 个位置

  1. /home//Documents/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 模块一起使用,并且可能是第三方库的供应商目录?

抱歉,如果我的问题太笼统了。

【问题讨论】:

  • 自下而上地工作。首先将依赖库转换为 go.mod。由于它们是一个后发行版,因此将它们分叉到您需要的版本并将 go.mod 添加到此分叉版本。然后在更高级别的包中使用这个新的依赖项。
  • @colm.anseo,没有一个服务器相互依赖。这些服务器仅依赖于 ~/Documents/perforce/modules/thirdparty/golibs 和 ~/Documents/perforce/modules/sggolibs/ 中的 perforce 库,这里第三方库仅包含来自 Internet 的库,即; github.com/gorilla github.com/go-redis 我想将 go.mod 文件添加到我的服务器代码中,其中的库指向这些 $GOPATH 库中的确切版本。

标签: go go-modules govendor


【解决方案1】:

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


一种选择是设置module proxy 来提供来自 Perforce 的依赖项,并让您的开发人员设置 GOPROXYGONOSUMDB 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 以填写依赖关系图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多