Golang Module快速入门
前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制。
注意:
在Golang1.11版本中需要使用
GO111MODULE=on
来显式开启go module在Golang1.12之后默认开启了module
基本命令
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init projectname 初始化当前文件夹, 创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
注意启用go mod时
- Windows环境用set
- linux环境用export
启用 go mod (linux环境)
启用当前项目的go mod 模式 设置代理
export GO111MODULE=on #on(开启) / off(关闭) export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct ## 设置代理 go mod init projectname # projectname(创建的项目名字) go mod tidy #下载依赖
全局启用gomod
Go1.14版本之后,都推荐使用go mod
模式来管理依赖了,也不再强制我们把代码必须写在GOPATH
下面的src
目录了,你可以在你电脑的任意位置编写go代码。
Go1.16
默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct
,
由于国内访问不到 https://proxy.golang.org
所以我们需要换一个PROXY
,这里推荐使用https://goproxy.io
或 https://goproxy.cn
。
可以执行下面的命令修改GOPROXY
:
设置全局
go env -w GO111MODULE=on
#设置全局开启 go mod Go1.16版本默认为on,可跳过这一步
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
#设置全局代理地址
设置局部
export GO111MODULE=on #on(开启) / off(关闭) Go1.16版本默认为on,可跳过这一步
export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
以下三个代理地址都可以
https://goproxy.cn //七牛云赞助支持的开源代理
https://mirrors.aliyun.com/goproxy //阿里云官方维护的go代理
https://goproxy.io //也是一个开源的go代理
安装依赖包
go mod tidy
如果有下载不了的包,可以用replace转换
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
表示间接引用
依赖的版本
go mod支持语义化版本号,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,当然也可以跟git提交哈希,比如go get foo@e3702bed2。关于依赖的版本支持以下几种格式:
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest
replace
在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。
replace (
cloud.google.com/go => github.com/cloudlibz/gocloud v0.0.0-20190327150524-ce252de9e210
golang.org/x/build => github.com/golang/build v0.0.0-20190416225751-b5f252a0a7dd
golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190411191339-88737f569e3a
golang.org/x/exp => github.com/golang/exp v0.0.0-20190413192849-7f338f571082
golang.org/x/image => github.com/golang/image v0.0.0-20190417020941-4e30a6eb7d9a
golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422
golang.org/x/mobile => github.com/golang/mobile v0.0.0-20190415191353-3e0bab5405d6
golang.org/x/mod => github.com/golang/mod v0.1.0
golang.org/x/net => github.com/golang/net v0.0.0-20190415214537-1da14a5a36f2
golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20190402181905-9f3314589c9a
golang.org/x/perf => github.com/golang/perf v0.0.0-20190312170614-0655857e383f
golang.org/x/sync => github.com/golang/sync v0.0.0-20190412183630-56d357773e84
golang.org/x/sys => github.com/golang/sys v0.0.0-20190416152802-12500544f89f
golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4
golang.org/x/tools => github.com/golang/tools v0.0.0-20190417005754-4ca4b55e2050
golang.org/x/xerrors => github.com/golang/xerrors v0.0.0-20190410155217-1f06c39b4373
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
google.golang.org/api => github.com/googleapis/google-api-go-client v0.3.2
google.golang.org/appengine => github.com/golang/appengine v1.5.0
google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190415143225-d1146b9035b9
google.golang.org/grpc => github.com/grpc/grpc-go v1.20.0
gopkg.in/asn1-ber.v1 => github.com/go-asn1-ber/asn1-ber v0.0.0-20181015200546-f715ec2f112d
gopkg.in/fsnotify.v1 => github.com/Jwsonic/recinotify v0.0.0-20151201212458-7389700f1b43
gopkg.in/gorethink/gorethink.v4 => github.com/rethinkdb/rethinkdb-go v4.0.0+incompatible
gopkg.in/ini.v1 => github.com/go-ini/ini v1.42.0
gopkg.in/src-d/go-billy.v4 => github.com/src-d/go-billy v4.2.0+incompatible
gopkg.in/src-d/go-git-fixtures.v3 => github.com/src-d/go-git-fixtures v3.4.0+incompatible
gopkg.in/yaml.v2 => github.com/go-yaml/yaml v2.1.0+incompatible
k8s.io/api => github.com/kubernetes/api v0.0.0-20190416052506-9eb4726e83e4
k8s.io/apimachinery => github.com/kubernetes/apimachinery v0.0.0-20190416092415-3370b4aef5d6
k8s.io/client-go => github.com/kubernetes/client-go v11.0.0+incompatible
k8s.io/klog => github.com/simonpasquier/klog-gokit v0.1.0
k8s.io/kube-openapi => github.com/kubernetes/kube-openapi v0.0.0-20190401085232-94e1e7b7574c
k8s.io/utils => github.com/kubernetes/utils v0.0.0-20190308190857-21c4ce38f2a7
sigs.k8s.io/yaml => github.com/kubernetes-sigs/yaml v1.1.0
github.com/Unknwon/com => github.com/unknwon/com latest //不知道版本,可以用这个latest下载最新的
github.com/Unknwon/com => github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e
)
手动下载安装依赖包
go get -u 包地址
在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
- 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
- 运行go get -u=patch将会升级到最新的修订版本
- 运行go get package@version将会升级到指定的版本号version
如果下载所有依赖可以使用go mod download命令。
整理依赖
我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系。
go mod edit
格式化
因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:
go mod edit -fmt
添加依赖项
go mod edit -require=golang.org/x/text
移除依赖项
如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:
go mod edit -droprequire=golang.org/x/text
关于go mod edit的更多用法可以通过go help mod edit查看。
在项目中使用go module
既有项目
如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:
- 在项目目录下执行go mod init,生成一个go.mod文件。
- 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。
新项目
对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:
- 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
- 执行go mod tidy 下载安装依赖包
- 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。
更多详细说明文档:
https://www.liwenzhou.com/posts/Go/go_dependency/
最后编辑:admin 更新时间:2024-12-22 19:32