使用go module导入本地包
使用go module导入本地包
go module
是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13
版本开始,go module
将是Go语言默认的依赖管理工具。到今天Go1.14
版本推出之后Go modules
功能已经被正式推荐在生产环境下使用了。
如何使用go module
导入本地包,作为初学者大家刚开始接触package的时候肯定都是先在本地创建一个包,然后本地调用一下,然后就被卡住了,如何使用go module
导入本地包。
前提
假设我们现在有moduleDemo
和mypackage
两个包,其中moduleDemo
包中会导入packageDemo
包并使用它的New
方法。
mypackage/packageDemo.go
内容如下:
package mypackage
import "fmt"
func New(){
fmt.Println("mypackage.New")
}
我们现在分两种情况讨论:
在同一个项目下
注意:在一个项目(project)下我们是可以定义多个包(package)的。
目录结构
现在的情况是,我们在moduledemo/main.go
中调用了mypackage
这个包。
moduleDemo
├── go.mod
├── main.go
└── mypackage
└── packageDemo.go
go mod
模式
go mod init moduleDemo
注:init
初始化的名字, 在导入包时候是以init
后面的名字为基准开始导包
导入包
这个时候,我们需要在moduledemo/go.mod
中按如下定义:
module moduleDemo
go 1.17
然后在moduleDemo/main.go
中按如下方式导入mypackage
package main
import (
"fmt"
"moduleDemo/mypackage" // 导入同一项目下的mypackage包
)
/*
@author RandySun
@create 2021-09-30-8:47
*/
func main() {
mypackage.New()
fmt.Println("main")
}
举个例子
举一反三,假设我们现在有文件目录结构如下:
└── bubble
├── dao
│ └── mysql.go
├── go.mod
└── main.go
其中bubble/go.mod
内容如下:
go mod init github.com/randysun/bubble
module github.com/randysun/bubble
go 1.17
bubble/dao/mysql.go
内容如下:
package dao
import "fmt"
func New(){
fmt.Println("dao....")
}
bubble/main.go
内容如下:
package main
import (
"fmt"
"github.com/randysun/bubble/dao"
)
/*
@author RandySun
@create 2021-09-30-8:56
*/
func main() {
dao.New()
fmt.Println("main")
}
不在同一个项目下
目录结构
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
导入包
这个时候,mypackage
也需要进行module初始化,即拥有一个属于自己的go.mod
文件,内容如下:
module mypackage
go 1.17
然后我们在moduledemo/main.go
中按如下方式导入:
package main
import (
"fmt"
"mypackage"
)
/*
@author RandySun
@create 2021-09-30-8:47
*/
func main() {
mypackage.New()
fmt.Println("main")
}
因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod
文件中使用replace
指令。
在调用方也就是moduledemo/go.mod
中按如下方式指定使用相对路径来寻找mypackage
这个包。
module moduleDemo
go 1.17
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"
举个例子
最后我们再举个例子巩固下上面的内容。
我们现在有文件目录结构如下:
├── p1
│ ├── go.mod
│ └── main.go
└── p2
├── go.mod
└── p2.go
p1/main.go
中想要导入p2.go
中定义的函数。
p2/go.mod
内容如下:
module randy.com/randysun/p2
go 1.17
p1/main.go
中按如下方式导入
import (
"fmt"
"randy.com/randysun/p2"
)
func main() {
p2.New()
fmt.Println("main")
}
因为我并没有把randy.com/randysun/p2
这个包上传到randy.com
这个网站,我们只是想导入本地的包,这个时候就需要用到replace
这个指令了。
p1/go.mod
内容如下:
module github.com/randysun/p1
go 1.17
require "randy.com/randysun/p2" v0.0.0
replace "randy.com/randysun/p2" => "../p2"
此时,我们就可以正常编译p1
这个项目了。