非开源项目中go mod导入本地包
非开源go项目,如何导入本项目的另一个module。
项目结构如下:
├── demo
├── go.mod
├── go.sum
├── main
│ └── main.go
├── tmpl
│ ├── service.go.extension.gotmpl
│ ├── service.go.gotmpl
│ └── service.go.tmpl
└── tmplgen
├── go.mod
├── go.sum
├── service.go.extension.gotmpl.go
└── service.go.gotmpl.go
上述项目中,main.go中导入tmplgen下template包。使用import "tmplgen/template"
的方式导入,执行go mod tidy
报错:
template-demo go mod tidy
template-demo/main imports
tmplgen/template: package tmplgen/template is not in GOROOT (/usr/local/Cellar/go/1.16.1/libexec/src/tmplgen/template)
观察报错报错信息,可见go mod无法在$GOROOT中找到template包。template包定义在当前目录下,所以需指定template包的导入路径。指定go mod包的导入路径,就需要使用go mod replace
。在main包的go.mod
中添加:
replace tmplgen/template => ./tmplgen
- template包在被导入之前,需通过
go mod init template
命令初始化,否则会报错:
➜ template-demo go mod tidy
go: tmplgen/template@v0.0.0-00010101000000-000000000000 (replaced by ./tmplgen): reading tmplgen/go.mod: open /Users/brick/workspace/pl-pro/template-demo/tmplgen/go.mod: no such file or directory
go 官方blog说明:
As of Go 1.11, the go command enables the use of modules when the current directory or any parent directory has a go.mod, provided the directory is outside $GOPATH/src.
- go module路径的第一部分应当为域名或路径: