簡體   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