[英]Go mod replace and github forks of /vN repositories
我刚刚向http://periph.io/x/devices/v3发送了一个拉取请求; 它已经被合并了,但是关于这个过程的一些事情是次优的:
首先我克隆了存储库(实际上是http://github.com/periph/devices;该模块名为periph.io/x/devices/v3
),所以我的 fork 自动称为http://github.com /lutzky/设备。 我想测试一段我正在使用修改后的库的单独代码,称之为testclient
; 将此添加到testclient/go.mod
作品:
replace periph.io/x/devices/v3 v3.6.9 => ../devices
但是,这也应该有效(如果拉取请求需要更长的时间才能被接受,这将很有用),并且不会:
replace periph.io/x/devices/v3 v3.6.9 => github.com/lutzky/devices main
这给出了这个错误:
testclient/go.mod:15: replace github.com/lutzky/devices:
version "v0.0.0-20210508194004-cae0146d8900" invalid:
go.mod has post-v0 module path "periph.io/x/devices/v3" at revision cae0146d8900
凭直觉,我想我会创建一个标签v3.6.9-newfeature
并将其推送到我的 fork,然后将replace
命令指向那里。 这也不起作用:
testclient/go.mod:15: replace github.com/lutzky/devices:
version "v3.6.9-newfeature" invalid:
module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v3
所以我不能使用 v0 标签,因为go.mod
说它是v3
,但我不能使用 v3 标签,因为 URL 没有/v3
。 我认为我不应该在我的分叉存储库中修改go.mod
(一方面,这会使拉取请求变得愚蠢)。 go 的预期方法是什么?
这是您正在寻找的修复程序,我测试了以下go.mod
文件,它可以工作,
module test
go 1.14
replace periph.io/x/devices/v3 => github.com/lutzky/devices/v3 v3.6.9-newfeature
require (
periph.io/x/devices/v3 v3.6.9 // indirect
)
我首先安装了periph.io/x/devices/v3
,
go get periph.io/x/devices/v3
然后我在go.mod
中插入了替换,
replace periph.io/x/devices/v3 => github.com/lutzky/devices/v3 main
格式: replace <original_module> => <forked_repo> <branch>
然后我只跑了go get
。 之后,replace 指令中的main
被替换为v3.6.9-newfeature
,这是 fork repo main
分支上的最新标签,从而为您提供了您在上面看到的内容。
感谢 ramaraja-ramanujan@ 的回答和更多的调试,我找到了答案。
TL;DR - 正确答案是:
replace periph.io/x/devices/v3 v3.6.9 => github.com/lutzky/devices/v3 main
// this part was missing ^^^
这将在构建时立即起作用,并且go mod tidy
(或go get
)会将main
更改为特定标签。 对此有几个有趣的旁注:
v3.6.9-newfeature
标签是我自己的; 我创建它是为了让它发挥作用。 我已经删除了它,但是go mod tidy
不断用v3.6.9-newfeature
替换main
- 无论我清除了多少缓存! 运行strace
发现go
正在联系http://proxy.golang.org 。 要禁用此功能,我运行了GOPROXY=direct go get
。 这用伪版本v3.6.10-0.20210508194004-cae0146d8900
替换了该行。 请注意,这与我的 fork 中的当前main
提交匹配,并且我的 fork 和原始 repo 都没有v3.6.10
- 它似乎从现有的v3.6.9
开始并增加了它。
/v3
不是子目录实际上,源代码库 ( https://github.com/periph/devices ) 没有v3
子目录。 我认为发生的事情是periph.io
域正在做一些诡计 - 确实使用浏览器访问http://periph.io/x/devices/v3确实有效。 但是,Go 的解析似乎采用模块路径中的最终/v3
来指示,在这种情况下,不指示子目录(但实际上是对标签名称的限制)。 这显然是允许的,并在https://golang.org/ref/mod中进行了讨论,但这并不完全简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.