Go 转到/vN存储库的mod replace和github分叉
我刚刚向发送了一封邮件,该邮件已被合并,但该流程有些地方不太理想: 首先,我克隆了存储库(实际上该模块名为Go 转到/vN存储库的mod replace和github分叉,go,Go,我刚刚向发送了一封邮件,该邮件已被合并,但该流程有些地方不太理想: 首先,我克隆了存储库(实际上该模块名为periph.io/x/devices/v3),因此会自动调用我的fork。我想用修改后的库测试一段单独的代码,称之为testclient;将此项添加到testclient/go.mod工作: replace periph.io/x/devices/v3 v3.6.9 => ../devices 但是,这也应该起作用(如果pull请求需要更长的时间才能被接受,这将非常有用),并且不会
periph.io/x/devices/v3
),因此会自动调用我的fork。我想用修改后的库测试一段单独的代码,称之为testclient
;将此项添加到testclient/go.mod
工作:
replace periph.io/x/devices/v3 v3.6.9 => ../devices
但是,这也应该起作用(如果pull请求需要更长的时间才能被接受,这将非常有用),并且不会:
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
(一方面,这会使pull请求变得愚蠢)。你打算怎么做?这是你正在寻找的修复方法,我测试了下面的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
,中插入了替换
替换periph.io/x/devices/v3=>github.com/lutzky/devices/v3 main
格式:
replace=>
然后我只运行了
go-get
。在那之后,replace指令中的main
被替换为v3.6.9-newfeature
,这是forked 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
正在联系。要禁用此功能,我运行了GOPROXY=directgoget
。这用v3.6.10-0.20210508194004-cae0146d8900
替换了该行。请注意,这与my fork中当前的main
commit匹配,my fork和原始回购都没有v3.6.10
——它似乎是从现有的v3.6.9
开始并递增的
/v3
不是子目录
实际上,源repo()没有v3
子目录。我认为发生的事情是,periph.io
域在做一些诡计——事实上,使用浏览器确实有效。然而,Go的解析似乎采用模块路径中的最后一个/v3
,在本例中不表示子目录(但实际上是对标记名的限制)。这显然是允许的,并在中进行了讨论,但这并不完全是直截了当的