我在使用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
。
答案 0 :(得分:23)
您可以通过在go.mod中添加一个require语句和一个具有相对文件路径的匹配replace语句来像您所要求的那样具有本地“子”模块。
在“根目录”中。/go.mod:
module example.com/localModule
require example.com/localModule/model v0.0.0
replace example.com/localModule/model v0.0.0 => ./model
答案 1 :(得分:1)
出现此错误的原因是因为您定义了两个模块,这些模块不知道如何在本地磁盘上相互查找。
$ go build
main.go:4:8: unknown import path "example.com/localModule/model":
cannot find module providing package example.com/localModule/model
虽然可以使用replace
指令让一个模块在磁盘上找到另一个模块,但更常见,更直接的解决方案是:
go.mod
文件,并且go.mod
文件放在存储库的根目录中。 这是一个非常简单的解决方案,这意味着您在存储库中的两个软件包将能够相互查找,这避免了您报告的错误消息,并且避免了此处需要使用replace
指令
Russ Cox在#26664中发表了评论:
对于除高级用户以外的所有用户,您可能希望采用一种惯例,即一个仓库=一个模块。存储库可以包含多个模块对于代码存储选项的长期发展很重要,但是默认情况下,您肯定不需要这样做。
如果您想在单个存储库中定义多个模块,则如何正确执行操作会有很多细微差别,并且Modules Wiki中有entire section关于如何管理复杂性与单个存储库中的多个模块相关联,包括以下建议:
在单个存储库中添加模块,删除模块以及对具有多个模块的版本控制模块需要大量的考虑和审议,因此管理单个模块存储库几乎总是更容易,更简单现有存储库中的模块。
和
如果您考虑在单个存储库中包含多个模块,请仔细阅读sub-section中的所有常见问题解答。