Go Module本地依赖的两种玩法

Overview

两种情况

先看两种依赖关系,如下:

  1. 同一module下的不同package依赖
  2. 不同module下的不同package依赖

第一种情况,假设module名称是go_playpackage分别是foobarbiz则依赖关系简单表示为:

第二种情况,假设两个module分别是go_playgo_play_another,新增的packagebaz,则依赖关系简单表示为:

解决方案

情况一

第一种情况,目录结构如下:

 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_nameimport其他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所在的目录。