[英]Go get cannot find local packages when using multiple modules in a repo
我遇到了go新模塊系統的問題,因為我想定義一個本地模塊並將其導入主程序中。 本地程序包駐留在主程序包/根文件夾的文件夾中。 想象一下$GOPATH
之外的以下項目結構。
./main.go
package main
import "fmt"
import "example.com/localModule/model"
func main() {
var p = model.Person{name: "Dieter", age:25}
fmt.Printf("Hello %s\n", p.name)
}
./model/person.go
package model
type Person struct {
name string
age int
}
在根文件夾中,我通過調用初始化了一個模塊
go mod init example.com/localModule
在model/
文件夾中,我然后通過調用初始化子模塊
go mod init example.com/localModule/model
在根文件夾中調用以下命令失敗。
$ go get
go build example.com/localModule/model: no Go files in
$ go build
main.go:4:8: unknown import path "example.com/localModule/model": cannot find module providing package example.com/localModule/model
go get的錯誤消息被切斷了,我不會錯誤地解析它。
我不打算將模塊推送到服務器,只需要一種引用本地包model
,所以我分別選擇了example.com/localModule/
和example.com/localModule/model
。
我在運行MacOS 10.13.6的Macbook上使用go1.11 darwin/amd64
。
您可以通過在go.mod中添加require語句和匹配的replace語句以及相對文件路徑來獲得您所要求的本地“子”模塊。
在“root”./go.mod中:
module example.com/localModule
require example.com/localModule/model v0.0.0
replace example.com/localModule/model v0.0.0 => ./model
您收到此錯誤的原因是您已定義了兩個不知道如何在本地磁盤上找到彼此的模塊。
$ go build
main.go:4:8: unknown import path "example.com/localModule/model":
cannot find module providing package example.com/localModule/model
replace
您可以將replace
指令添加到頂層模塊的go.mod
文件中,例如:
replace example.com/localModule/model v0.0.0 => ./model
它讓頂層模塊在磁盤上找到另一個模塊。 這在模塊維基上的替換FAQ和“多模塊存儲庫”部分中有更詳細的介紹。
然而,這是一個更復雜的解決方案,可能很難正確,通常是更多的正在進行的工作,並且有一些限制,例如除了當前模塊之外的所有模塊都會忽略replace
。 對於大多數人來說,多模塊回購可能不是他們想要的。 在這一點上,真正需要在單個存儲庫中擁有多個模塊是相對罕見的。
雖然可以使用replace
指令,但更常見和直接的解決方案是:
go.mod
文件,和 go.mod
文件放在存儲庫的根目錄中。 這是一個非常簡單的解決方案,這意味着存儲庫中的兩個軟件包將能夠自動找到彼此而無需任何replace
,從而避免了您報告的錯誤消息。
replace
為多模塊repo,而不是單模塊repo? Russ Cox評論#26664 :
對於除了高級用戶之外的所有用戶,您可能希望采用通常的約定,即一個repo =一個模塊。 對於代碼存儲選項的長期演變而言,repo 可以包含多個模塊非常重要,但是幾乎肯定不是默認情況下你想做的事情。
如果您希望在單個存儲庫中定義多個模塊,那么關於如何正確執行此操作會有相當多的細微差別,並且應該閱讀有關如何管理與之相關的復雜性的模塊維基的整個部分 。單個存儲庫中的多個模塊,包括以下建議:
在單個存儲庫中添加模塊,刪除模塊以及使用多個模塊對模塊進行版本控制需要非常小心和慎重,因此管理單模塊存儲庫而不是現有存儲庫中的多個模塊幾乎總是更容易和更簡單 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.