Go Module本地依赖的两种玩法
Overview
两种情况
先看两种依赖关系,如下:
- 同一
module
下的不同package
依赖 - 不同
module
下的不同package
依赖
第一种情况,假设module
名称是go_play
,package
分别是foo
、bar
、biz
则依赖关系简单表示为:
第二种情况,假设两个module
分别是go_play
和go_play_another
,新增的package
是baz
,则依赖关系简单表示为:
解决方案
情况一
第一种情况,目录结构如下:
1go_play
2├── bar
3│ └── bar.go
4├── biz
5│ └── biz.go
6├── foo
7│ └── foo.go
8├── go.mod
9├── play.go
10└── play_test.go
初始化module
的方法是:
1go mod init go_play
按照图中的依赖关系,可以用module_name/package_name
的方式import
同一module
下的其他package
,例如在bar.go
中可以是:
1package bar
2
3import (
4 "fmt"
5 _ "go_play/biz"
6)
7
8func init() {
9 fmt.Println("bar.....")
10}
此时,如果biz
中有init
函数则执行之。
情况二
第二种情况,新增module
,其目录结构:
1go_play_another
2├── baz
3│ ├── baz.go
4│ └── baz_test.go
5└── go.mod
可以用同样的方法(module_name/package_name
)import
其他module
下的package
,但需要在go.mod
中声明依赖:
1module go_play_another
2
3go 1.12
4
5require go_play v0.0.0
6
7replace go_play => ../go_play
这里的关键是replace
后的内容,将一个共享的module
替换成本地module
所在的目录。