[英]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.