实际项目总要依赖各种第三发开发包,各类开发语言都有自己的第三方包依赖管理工具,例如:java的maven、js的npm、php的composer等,golang在1.11版本以前官方是没有提供包依赖管理工具的,只有一些社区提供的工具,从1.11版本以后官方就提供mod模块管理工具。
下面介绍如何使用go mod管理第三方依赖包
1.升级go语言版本
目前最新的go语言版本是1.16, 如果你是最新的版本可以不用重新安装。
提示:如果你的go版本是1.11-1.13这些老版本,需要通过下面配置开启模块管理功能,新版本可以直接跳过这个章节。
通过环境变量GO111MODULE设置是否开启模块管理,GO111MODULE有三种值:
- off - 关闭module功能
- on - 打开module功能
- auto - 如果项目在GOPATH路径下面,不使用module功能,如果项目在GOPATH路径之外,则开启module功能。
linux/macos设置环境变量:
修改~/.bash_profile或者~/.bashrc文件,添加下面配置
export GO111MODULE=on
使用module模块管理功能,我们就可以把项目放在任何目录。
2.初始化模块
切换到项目根目录,执行下面命令。
命令说明:
go mod init 项目名
项目名,建议使用域名作为前缀,例如: tizi365.com/blog
说明:使用域名作为包前缀可以确保全球唯一,如果你开发的包需要开源给其他人使用,可以避免冲突。
例子:
// 创建项目目录
mkdir blog
// 切换到blog
cd blog
// 初始化模块
go mod init tizi365.com/blog
初始化模块后,会在当前目录生成一个go.mod文件,这个文件记录了当前项目依赖的第三方包。
go.mod文件内容如下,目前因为还没安装依赖包,所以没有依赖包信息。
module tizi365.com/blog
go 1.16
提示:go.mod文件需要提交到git仓库中,方便其他开发自动安装依赖包。
3.自动分析源码,安装依赖包
经过上面步骤初始化之后,执行下面命令,会自动分析源码中的依赖包,安装缺少的依赖包。
例子:
// 自动分析源码中的依赖,安装依赖包
go mod tidy
// 在项目根目录安装依赖包,会自动将依赖信息写入go.mod
go get github.com/jinzhu/gorm
// 运行程序
go run main.go
// 构建项目
go build
当执行上面任何命令之后,如果你打开go.mod文件,会发现多了一些依赖包的信息。
例子:
文件名:main.go
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
运行程序
// 自动分析源码中的依赖,安装依赖包
go mod tidy
// 执行
go run main.go
打开go.mod文件,内容类似下面:
module tizi365.com/blog
go 1.16
require (
github.com/labstack/echo v3.3.10+incompatible // indirect
github.com/labstack/gommon v0.3.0 // indirect
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc // indirect
)
4.手动安装依赖包
只要在项目目录,执行go get命令安装第三方包,会自动更新go.mod文件,将依赖信息添加进去,因此我们只要将go.mod提交到代码仓库中,其他开发者只要更新代码,运行程序,就会自动下载缺少的依赖包。
5.vendor目录
默认情况下,Go语言安装的第三方依赖包,是安装在GOPATH/src目录下面,不是安装在项目目录中,go编译器也会到GOPATH目录中查找安装包。
go语言也支持将第三方依赖包安装到项目目录中,这个目录就是vendor,如果项目的根目录下面存在vendor目录,编译器优先到vendor目录中查找依赖包。
下面是go module的命令,可以一键创建vendor目录,将依赖包复制进去。
// 在项目根目录执行
go mod vendor
命令执行成功后,项目根目录多了一个vendor目录,里面包含我们项目依赖的所有第三方包。