關於 Go Modules 巢狀引入本地包的問題

qiu800發表於2020-02-17

Golang 資料夾下 有三個 go 包: 分別建立 blog 包 article 包 和 third 包

blog 包裡引入 article 包的內容:

article 包裡有 go.mod 和 tools.go 檔案 go.mod 內容:

module article
go 1.13

tools.go 內容:

package article
func Hello() string {
    return "Hello Article."
}

blog 包裡有 go.mod 和 main.go 檔案 go.mod 內容:

module blog
require github.com/local/article v0.0.0
replace github.com/local/article => ../article
go 1.13

main.go 內容:

package main
import (
    "fmt"
    "github.com/local/article"
)
func main() {
    fmt.Println(article.Hello())
}

現在 go run blog 包下的 main.go 一切正常 輸出:Hello Article.

現在要讓 article 包 引入 本地 third 包

third 包下有 go.mod 和 casual.go 檔案 go.mod 內容:

module third
go 1.13

casual.go 內容:

package third
import "fmt"
func World() {
    fmt.Println("Hello third.")
}

修改 article 下的 go.mod 為:

module article
require github.com/local/third v0.0.0
replace github.com/local/third => ../third
go 1.13

修改 tools.go 在 Hello 函式中加入對 third 函式 World 的引入(其實這裡加不加都一樣 只要 article 的 go.mod 里加入了本地包,即使顯示宣告 replace 也沒用):

package article
import "github.com/local/third"
func Hello() string {
    third.World()
    return "Hello Article."
}

然後這時 再去 blog 包 執行 main.go 會出錯,提示: go: github.com/local/article@v0.0.0 requires github.com/local/third@v0.0.0: reading https://goproxy.io/github.com/local/third/@v/v0.0.0.mod: 404 Not Found 也就是 third 目前忽略了 article 中 go.mod 的 replace github.com/local/third => ../third 宣告,直接去伺服器找 third,我感覺這個很不合理, 但我又不知道問題出在哪,所以很苦惱。 既然 blog 包 引入本地 article 包,而 article 引入本地 third 包 並已經顯示宣告瞭 replace,這個應該一直有效,但我確實找不到有效的方法,所以請大神幫幫我!

而我目前使用的最笨的處理方式是: 再在 blog 包裡 重新把 article 的 go.mod 中的那句(replace github.com/local/third => ../third)在此再宣告一次,這樣操作的話,就一切正常!

module blog
require github.com/local/article v0.0.0
replace github.com/local/article => ../article
go 1.13

也就是說我,以我這種笨方法,現在有個本地 A 包,引入(A 包下的 go.mod 已經顯示宣告 replace 了 B 包的本地路徑 以下同此)了本地 B 包, B 包又引入了本地 C 包(同上),C 包又引入了本地 D 包.......D->E->F->G

那麼現在我要讓 A 包能正常工作,則必須在 A 包的 go.mod 下,把每一個 B,C,D,E,F 下的 go.mod 中的 replace 本地包路徑在這裡都要重新再寫一遍, 我感覺這個肯定不對,所以肯請大神幫我解決一下困擾我很久的問題,本人不勝感激,謝謝!

有人說是 包路徑問題: 我嘗試著把 article 引入本地 third 的包名從上面的:

require github.com/local/third v0.0.0
replace github.com/local/third => ../third

改成:

require github.com/ocean/third v0.0.0
replace github.com/ocean/third => ../third

或 改成:

require github.com.cn/ocean/third v0.0.0
replace github.com.cn/ocean/third => ../third

結果都一樣 還是提示(只不過是把代理伺服器後面的地址給變了,說白了還是 replace 沒起效):go: github.com/local/article@v0.0.0 requires github.com.cn/ocean/third@v0.0.0: reading https://goproxy.io/github.com.cn/ocean/third/@v/v0.0.0.mod: 404 Not Found

更多原創文章乾貨分享,請關注公眾號
  • 關於 Go Modules 巢狀引入本地包的問題
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章