什么是go mod
go mod 是go语言的包管理工具,类似java 的maven,go mod的出现可以告别goPath,使用go module来管理项目,有了go mod账号就不需要非得把项目放到gopath/src目录下了,你可以在磁盘的任何位置新建一个项目
go mod在go语言的1.11版本后推出,但是在早期,go mod 非常难用,被广大的开发者所诟病;现在已经好了很多了
常用命令
通过命令go mod help
可以看到有go mod有以下几个命令
download
:下载module到本地缓存,下载到GOMODCACHE指定的路径edit
: 编辑graph
:以文本形式打印模块需求图init
:创建go mod 项目tidy
添加缺失module,或者去除没有使用的modulevendor
将项目的依赖库下载到项目内部,作为项目的一部分来编译。verify
验证依赖是否正确why
explain why packages or modules are needed
下载依赖 go get
方式
go get命令会下载指定的包,并将下载的包进行编译,然后安装到特定目录。
go get github.com/go-redis/redis
除此之外,go get还提供以下几个参数
-d
:只下载不安装-f
:只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用-t
:同时也下载需要为运行测试所需要的包-u
:强制使用网络去更新包和它的依赖包-v
:显示执行的命令
下载依赖 go.mod
方式
在mod文件中添加 require(依赖链接 版本号)
即可,示例:
module demo_94_tail
go 1.17
require (
github.com/hpcloud/tail v1.0.0 // indirect
)
添加完成后在执行以下命令即可将依赖下载到本地
go mod download
查看go mod状态
go env
找到以下的配置项就是go mod的配置,为什么叫 GO111MODULE 呢,中间的111是因为从1.11版本后推出的功能,
set GO111MODULE=on
设置代理
默认的代理是GOPROXY=https://proxy.golang.org,direct
,但是这个链接是国外的网站,得翻墙才能用,所以我们用国内的代理
go env -w GOPROXY=https://goproxy.cn,direct
开启/关闭go mod
GO111MODULE 有三种状态
- on : 开启
- off : 关闭
- auto :默认值,go命令会根据当前目录来决定是否启用module功能
开启 go mod
go env -w GO111MODULE=on
关闭 go mod
go env -w GO111MODULE=off
download 下载
下载module到本地缓存,下载到GOMODCACHE
指定的路径,可通过go env -w GOMODCACHE=/xxx/xxx
修改cache路径
go mod download
edit 编辑go.mod文件
# -replace 表示 包下载不下来的时候使用,--replace=新地址=下载不下来的地址
go mod edit -replace golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest
# -exclude 表示排除某个包
go mod edit -exclude golang.org/x/crypto@v0.0.0
# -require 表示导入某个包
go mod edit -require golang.org/x/crypto@v0.0.0
# -json 以json方式打印go.mod 模块对象
go mod edit -json
graph
以文本形式打印模块需求图
go mod graph
init 创建go mod 项目
进入项目目录下,执行以下命令,其中projectName
是你的项目名称, 建议和目录一致
go mod init projectName
执行完后会自动创建一个go.mod的文件,内容如下
module xx.xx.com/xd/projectName
go 1.14
tidy
添加缺失module,或者去除没有使用的module
go mod tidy
vendor
将项目的依赖库下载到项目内部,作为项目的一部分来编译。此时会生产一个vendor的目录,一般情况下都用不上
go mod vendor
verify
验证依赖是否正确
go mod verify
why
查找依赖
go mod why
打包编译
go build 编译
go build命令会编译包及其依赖,生成的文件存放在当前目录下。而且go build只对main包有效,其他包不起作用
go build
go install 编译并安装
和go build命令比较相似,go install对于非main包会生成静态文件放在$GOPATH/pkg目录下,文件扩展名为a。如果为main包,则会在$GOPATH/bin下生成一个和给定包名相同的可执行二进制文件。
go install
go build 、go install、go get 区别
go build
: go build命令是在当前目录编译生成可执行文件,注意 go build 指令会调用所有引用包的源码进行重新编译而不是使用之前pkg里的文件go install
: 执行 go install 命令会完成类似 go build 的功能 ,但go install 命令执行生成的可执行文件是在【$GOPATH/bin】目录中go get
: 该命令可以理解为两个操作 git clone + go install , 执行会将远程代码clone 到【$GOPATH/src】 目录中