繁体   English   中英

Go mod replace 和 github /vN 存储库的分支

[英]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更改为特定标签。 对此有几个有趣的旁注:

go 代理

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM