簡體   English   中英

在repo中使用多個模塊時,Go get無法找到本地包

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

解決方案1: replace

您可以將replace指令添加到頂層模塊的go.mod文件中,例如:

replace example.com/localModule/model v0.0.0 => ./model

它讓頂層模塊在磁盤上找到另一個模塊。 這在模塊維基上的替換FAQ“多模塊存儲庫”部分中有更詳細的介紹。

然而,這是一個更復雜的解決方案,可能很難正確,通常是更多的正在進行的工作,並且有一些限制,例如除了當前模塊之外的所有模塊都會忽略replace 對於大多數人來說,多模塊回購可能不是他們想要的。 在這一點上,真正需要在單個存儲庫中擁有多個模塊是相對罕見的。

解決方案2:一個repo ==一個模塊

雖然可以使用replace指令,但更常見和直接的解決方案是:

  • 在您的存儲庫中有一個go.mod文件,和
  • 將單個go.mod文件放在存儲庫的根目錄中。

這是一個非常簡單的解決方案,這意味着存儲庫中的兩個軟件包將能夠自動找到彼此而無需任何replace ,從而避免了您報告的錯誤消息。

replace為多模塊repo,而不是單模塊repo?

Russ Cox評論#26664

對於除了高級用戶之外的所有用戶,您可能希望采用通常的約定,即一個repo =一個模塊。 對於代碼存儲選項的長期演變而言,repo 可以包含多個模塊非常重要,但是幾乎肯定不是默認情況下你想做的事情。

如果您希望在單個存儲庫中定義多個模塊,那么關於如何正確執行此操作會有相當多的細微差別,並且應該閱讀有關如何管理與之相關的復雜性的模塊維基的整個部分 。單個存儲庫中的多個模塊,包括以下建議:

在單個存儲庫中添加模塊,刪除模塊以及使用多個模塊對模塊進行版本控制需要非常小心和慎重,因此管理單模塊存儲庫而不是現有存儲庫中的多個模塊幾乎總是更容易和更簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM