Go模塊是Go語言1.11版本引入的一個重要特性,它可以幫助開發者更好地管理和依賴項目中的第三方庫。對于之前的非模塊模式下開發的項目,php小編香蕉告訴大家,可以將模塊與非模塊模塊發布在同一路徑下。這樣做的好處是可以方便地將現有的項目逐步遷移到模塊模式下,同時也可以保持項目的可用性和穩定性。不過需要注意的是,在同一路徑下發布模塊和非模塊模塊時,需要遵循一些規則和約定,以確保項目的正常運行。
問題內容
我有一個小型庫,一直托管在非模塊存儲庫中,但我現在想將其轉換為 go 模塊。
我成功執行了:
go mod init go mod tidy
登錄后復制
go.mod
和 go.sum
文件的創建沒有錯誤,并且該庫仍然通過了測試。
之前的版本是v2.0.0
,所以我將版本增加到v3.0.0
,并將/v3
添加到go.mod
中的模塊名稱末尾。從我在網上看到的情況來看,這就是所需要的。
我的 go.mod
文件如下所示:
module tssgit.reyrey.com/teschste/go-utils/v3 go 1.19 require ( github.com/lib/pq v1.10.9 golang.org/x/text v0.9.0 )
登錄后復制
然后我將庫發布到我們的內部 git 服務器,并認為我已經準備好了。
當我嘗試將庫添加到新的 go 模塊項目時,我收到以下信息:
Installing: tssgit.reyrey.com/teschste/go-utils/v3 Installing dependency: tssgit.reyrey.com/teschste/go-utils/v3 go: module tssgit.reyrey.com/teschste/go-utils@upgrade found (v2.0.0+incompatible), but does not contain package tssgit.reyrey.com/teschste/go-utils/v3 Failed to add dependencies: exit status 1
登錄后復制
我發現,如果我將 v3.0.0
發布到新路徑 (tssgit.reyrey.com/teschste/go-utils2
),我就能夠成功地將其添加到我的新項目中,即使我再次增加了主項目版本。
我是否缺少一些可以讓我繼續以相同路徑發布的東西,或者這只是你不能做的事情?
如有任何幫助,我們將不勝感激!
解決方法
是的,這是支持的。版本子目錄是可選的。
我發現一種情況會導致您看到的錯誤。當主分支未更新(仍然指向標簽 v2.0.0
)并且新標簽 v3.0.0
未推送到服務器時,會發生這種情況。請仔細檢查以確保遠程存儲庫已更新。
如果遠程存儲庫已更新但仍然無法正常工作,您可以這樣縮小問題范圍:
使用 -x
選項運行 go get
:
$ go get -x tssgit.reyrey.com/teschste/go-utils/v3
登錄后復制
cd
進入輸出中顯示的目錄。目錄路徑是這樣的:
/home/username/go/pkg/mod/cache/vcs/96f42aa32430149c99ad6625ceafc5b59e047b9e11d6a03f687d59845b53b2d5
登錄后復制
在此目錄中,運行 git ls-remote -q origin
并檢查輸出。下面的例子是我的機器上不工作時的例子。可以看到head
和v2.0.0
都指向同一個commit id,并且沒有v3.0.0
。
$ git ls-remote -q origin 5ac4c172806e80461086ea9feb485cec0b6a27f0 HEAD 5ac4c172806e80461086ea9feb485cec0b6a27f0 refs/heads/main bbdc583c0b83489db1a30fa6ca8559ffa295a74d refs/heads/other-branch 5ac4c172806e80461086ea9feb485cec0b6a27f0 refs/tags/v2.0.0
登錄后復制