Go Modules模式
(1)go mod 命令
命令 | 作用 |
---|
go mod init | 生成 go.mod 文件 / 在当前文件夹下初始化一个新的 go.mod 文件 | go mod download | 下载 go.mod 文件中指明的所有依赖 / 下载依赖的module到本地cache | go mod tidy | 整理现有的依赖 / 增加失去的 module,去掉未用的module | go mod graph | 查看现有的依赖结构 | go mod edit | 编辑 go.mod 文件 | go mod vendor | 导出项目所有的依赖到 vendor 目录 / 将依赖复制到vendor下 | go mod verify | 校验一个模块是否被篡改过 / 校验依赖,检查下载到第三方库有没有本地修改,如果有修改,则返回非0,否则验证成功。 | go mod why | 查看为什么需要依赖某模块 / 解释为什么需要需要依赖 |
(2)go mod 环境变量
可以通过 go env 命令来进行查看
GO111MODULE="on"
GOPROXY="https://goproxy.cn,direct"
GOROOT="..."
GOSUMDB="sum.golang.org"
GOTMPDIR=""
...
GO111MODULE
Go 语言提供了GO111MODULE这个环境变量来作为 Go modules 的开关,其允许设置以下参数:
- auto:只要项目包含了 go.mod 文件的话启用 Go modules。
- on:启用 Go modules,推荐设置。
- off:禁用 Go modules,不推荐。
可以通过 go env -w GO111MODULE=on 来设置。
GOPROXY
这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。
- GOPROXY 的默认值是:https://proxy.golang.org,direct
proxy.golang.org 国内访问不了,需要设置国内的代理
- 阿里云:https://mirrors.aliyun.com/goproxy/
- 七牛云:https://goproxy.cn,direct
go env -w GOPROXY=https://proxy.golang.org,direct
direct的含义:指示符。指示go回源到模块版本的原地址去拉取。
比如一个模块 “github.com/xxx/json”,首先会到https://proxy.golang.org 中去抓取,如果找不到,会去github.com/xxx/json 源本身去拉取。
--------### GOPRIVATE
GONOPROXY/GONOSUMDB/GOPRIVATE ,通过设置GOPRIVATE即可。
设置方式:
go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx"
go env -w GOPRIVATE="*.example.com"
或者通过 Linux export 环境方式也可以设置
使用 Go Modules 初始化项目
(1)开启 Go Modules
go env -w GO111MODULE=on
又或是可以通过直接设置系统环境变量(写入对应的~/.bash_profile 文件亦可)来实现这个目的:
export GO111MODULE=on
(2)初始化项目
创建项目目录
mkdir -p $HOME/aceld/modules_test
cd $HOME/aceld/modules_test
执行 Go modules 初始化
go mod init github.com/aceld/modules_test
在执行 go mod init 命令时,我们指定了模块导入路径为 github.com/aceld/modules_test。接下来我们在该项目根目录下创建 main.go 文件,如下:
vim main.go
内容为:
import (
"fmt"
"github.com/aceld/zinx/ziface"
"github.com/aceld/zinx/znet"
)
type PingRouter struct {
znet.BaseRouter
}
func (this *PingRouter) Handle(request ziface.IRequest) {
fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))
err := request.GetConnection().SendBuffMsg(0, []byte("ping...ping...ping"))
if err != nil {
fmt.Println(err)
}
}
func main() {
s := znet.NewServer()
s.AddRouter(0, &PingRouter{})
s.Serve()
}
下载包
(base) ? modules_test ls
go.mod main.go
(base) ? modules_test pwd
/Users/username/aceld/modules_test
(base) ? modules_test go get github.com/aceld/zinx/znet
go: downloading github.com/aceld/zinx v1.0.1
go: added github.com/aceld/zinx v1.0.1
(base) ? modules_test go get github.com/aceld/zinx/ziface
生成 go.sum
启动程序
go run main.go
现在的 go.mod 文件内容:
module github.com/aceld/modules_test
go 1.18
require github.com/aceld/zinx v1.0.1
go.sum 文件:作用是当前的库是完整的库,校验是正确的。
表示依赖的模块名称、版本号、h1+hash(go.mod h1+hash)
- h1+hash(没有go.mod):表示将目标文件的zip压缩包打开之后,针对所有文件校验和来生成的hash(库里所有的包的值统一做哈希,保证所有文件的完整性)
- go.mod h1+hash:对mod做了哈希
下载的包实际上被下载到哪儿了呢?
/Users/username/goproject/pkg/mod/github.com/aceld/zinx@v1.0.1
修改项目模块的版本依赖关系
go mod edit -replace=zinx@1.1.0=zinx@1.2.0
安装包
1、go get (全局)
2、go download (全局)
依赖包会自动下载到 $GOPATH/pkg/mod,多个项目可以共享缓存的mod,注意使用go mod download 的时候首先需要在你的项目里面引入第三方包。
3、go mod vender(本项目)(主用)
【注意】
使用 go mod vendor 的时候首先需要在你的项目里面引入第三方包
函数init执行顺序
init函数会自动执行
main => import A => import B => import C
C.init() => B.init() => A.init() => main.init()
|