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
,在本例中不表示子目录(但实际上是对标记名的限制)。这显然是允许的,并在中进行了讨论,但这并不完全是直截了当的