Go 学习笔记 - module
Go 学习笔记 - module
1 介绍
go module 是 go 1.11 官方推出的版本管理工具,go 1.13 版本开始,go module 是go语言默认的依赖管理工具。
2. 启用
启用 go module 需要先设置环境变量 GO111MODULE ,通过它开启/关闭 模块支持,可选值: off, on, auto , 默认是 auto
GO111MODULE=off禁用模块支持,编译时候会从GOPATH和vender中查找包GO111MODULE=on开启模块支持,编译时只根据go.mod下载依赖,并保存到%GOPATH%/pkg/mod目录下GO111MODULE=auto,当项目在根目录下存在go.mod的时候,开启。
使用 go module 管理依赖后,会生成两个文件,go.mod 和 go.sum
go 1.11 之后,设置 GOPROXY 的命令为: export GOPROXY=https://goproxy.cn
go 1.13 之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的,推荐使用goproxy.cn。 go env -w GOPROXY=https://goproxy.cn,direct
3. GO MOD
go mod 命令如下:
go mod download下载依赖的module到本地cache,默认$GOPATH/pkg/modgo mod edit编辑go.mod文件go mod graph打印依赖图go mod init初始化项目,创建go.modgo mod tidy下载缺少的依赖, 并将无用依赖删除掉go mod vendor将依赖复制到vendor下go mod verify校验依赖go mod why解释为什么需要依赖go mod edit可以修改go.mod文件,并且go mod edit -fmt可以格式化文件内容go mod edit -require=golang.org/x/text可以添加依赖go mod edit -droprequire=golang.org/x/text可以删除依赖go help mod edit可以查看帮助
go mod 文件内容
module github.com/Q1mi/studygo/blogger
go 1.12
require (
github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
github.com/gin-gonic/gin v1.4.0
github.com/go-sql-driver/mysql v1.4.1
github.com/jmoiron/sqlx v1.2.0
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
module是包名require用来定义依赖包 和 版本indirect表示间接引用
4. GO GET
依赖包版本可以是git分之的tag,也可以是commit hash,支持如下几种格式。
go get gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
go get gopkg.in/vmihailenco/msgpack.v2 v2.9.1
go get gopkg.in/yaml.v2 <=v2.2.1
go get github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest
go get 可以下载依赖包,并且还可以指定版本:
go get -u会将升级到最新的次要版本或者修订版本go get -u=patch会升级到最新的修订版本go get package@version将会升级到指定版本
5. 在项目中使用 go module
- 既有项目启用
go module,go mod init生成go.mod文件,go get开始下载依赖包,并且生成go.sum依赖文件 - 新项目,
go mod init 项目名再当前项目文件下创建一个go.mod文件,手动编辑go.mod或者执行go get来进行依赖。
5.1 包和调用文件在同一项目下
例如:
moduledemo
├── go.mod
├── main.go
└── mypackage
└── mypackage.go // package mp 定义包名为 mp
步骤:
- 在项目下创建一个
go.mod文件 - 在
go.mod文件下添加module moduledemo // 设定 moduledemo 为包根目录名,可以随意改变该名字,只需要导入时一致就好 go 1.14 // 表明版本 - 导入想要的包文件
import "moduledemo/mypackage" // 这里是导入包目录下的包文件名 - 使用包文件
mp.MyPackage() // 使用包中的 MyPackage() 函数
5.2 包和被调用文件不在同一个项目下
例如:
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go // package mp 定义包名为 mp
步骤:
- 在
mypackage. 下面创建go.mod文件,并添加下面代码module mypackage go 1.14 - 在
moduledemo下面创建go.mod文件,并添加下面代码module moduledemo go 1.14 require mypackage v0.0.0 // 这个会在你执行 go build 之后自动在该文件添加 replace mypackage => ../mypackage // 指定需要的包目录去后面这个路径中寻找 - 导入和使用
import "mypackage" // 因为该包目录本身就是包文件所以无需添加下一级路径 mp.MyPackage() // 使用包中的 MyPackage() 函数