转自:https://studygolang.com/articles/31112?fr=sidebar

一、启用go mod

go env -w GO111MODULE=on #开启 MODULE
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct   #默认值为https://proxy.golang.org,direct

GO111MODULE可以设置为:off、on、auto(默认值),从GO111MODULE变量名可以看出,是Go1.11版本之后才出来有依赖包管理办法。

  • off时,则不使用go mod,查找依赖包的顺序是:当前项目根目录/vendor,其次是$GOPATH/src(这是Golang1.11版本之前的用法)。
  • on时,则开启go mod,查找依赖包是以当前项目根目录的go.mod文件为基准,会忽略 $GOPATH 和 vendor 文件夹,只根据go.mod下载依赖。
  • auto或未设置,则go命令根据当前目录启用或禁用模块支持。仅当当前目录位于$GOPATH/src之外且其本身包含go.mod文件或位于包含go.mod文件的目录下时,才启用模块支持。

GOPROXY为依赖包代理地址,由于像golang.org/x这种依赖包需要翻墙才能下载,所以建议设置成国内镜像地址:
https://goproxy.cn 为国内七牛云维护的GO的镜像地址。
https://goproxy.io 为国内另一个镜像地址。

二、初始化go.mod

进入项目根目录(假如目录名为project1),初始化一个moudle,模块名为你的项目名,必须为英文名称,允许字母数字下划线和/,但是不能以/开头。

go mod init [模块名]

如果我们的项目根目录在$GOPATH/src/中,模块名可以不填写,将自动生成,一般是与项目根目录名称同名,如project1github.com/project1;如果项目根目录不在$GOPATH/src/中,则模块名必须填写,模块名同样可以命名如project1github.com/project1,也就是说模块名不一定与路径对应起来,但如果我们使用了路径,如github.com/project1,后续也可以把项目搬到$GOPATH/src/github.com目录下去。
执行完后,会在当前项目根目录下创建一个go.mod文件,内容如:

module project1go 1.13

此时还没有任何依赖包信息。

三、整理依赖包

go mod tidy

命令执行后,go mod会去项目文件中发现依赖包,将依赖包名单添加到go.mod文件中,自动删除那些有错误或者没有使用的依赖包。

四、将依赖包拷贝到项目vendor

go mod vendor

在项目完工时,我们也可以把依赖包复制到项目根目录/vendor/,以便存档,其实也可以不做这个操作,有go.mod文档就够了。
项目根目录下有了vendor后,就可以这样编译:

go build -mod vendor -o ./project1  //project1为编译后的包名,或如下面,加上文件名
go build -mod vendor -o ./project1 main.go

五、其他常用命令

下载依赖包到本地缓存

go mod download

若之前拉过一次代码,会把该次go.mod里面的版本信息缓存到$GOPATH/pkg/mod/cache里面,
下载时如果cache有该版本信息,就用cache里面的版本信息去下载,否则重新下载。
注意:如果你已经拉取了一个tag版本下的包,若这个tag包含的信息被修改了,需要清除cache才能重新拉取这个这个更新后tag的信息。

清理本地依赖包

go clean -modcache

以上命令是go mod download的反操作,执行后会删除放置在$GOPATH/pkg/mod/cache下的依赖包缓存,有时依赖包出现错误,可以先清理后再重新下载到本地缓存。

添加单个依赖包

go mod edit -require=golang.org/x/text

移除单个依赖包
如果我们不再使用某个包了,可以单独移除,如:

go mod edit -droprequire=golang.org/x/text

验证依赖是否正确

go mod verify

解释为什么需要依赖

go mod why

校验所有依赖包的正确性

go mod verify

六、go.mod文档说明

go.mod文件可以通过require,replace,exclude语句来说明依赖包的管理规则:
require语句用于指定必不可少的依赖包
replace语句用于指定需要替换依赖包的地址,比如golang.org/x/text包替换成github.com/golang/text
exclude语句用于指定可以忽略依赖项模块
例如:

replace (cloud.google.com/go => github.com/googleapis/google-cloud-go v0.34.0github.com/go-tomb/tomb => gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7go.opencensus.io => github.com/census-instrumentation/opencensus-go v0.19.0go.uber.org/atomic => github.com/uber-go/atomic v1.3.2go.uber.org/multierr => github.com/uber-go/multierr v1.1.0go.uber.org/zap => github.com/uber-go/zap v1.9.1golang.org/x/crypto => github.com/golang/crypto v0.0.0-20181001203147-e3636079e1a4golang.org/x/lint => github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3golang.org/x/net => github.com/golang/net v0.0.0-20180826012351-8a410e7b638dgolang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20180821212333-d2e6202438begolang.org/x/sync => github.com/golang/sync v0.0.0-20181108010431-42b317875d0fgolang.org/x/sys => github.com/golang/sys v0.0.0-20181116152217-5ac8a444bdc5golang.org/x/text => github.com/golang/text v0.3.0golang.org/x/time => github.com/golang/time v0.0.0-20180412165947-fbb02b2291d2golang.org/x/tools => github.com/golang/tools v0.0.0-20181219222714-6e267b5cc78egoogle.golang.org/api => github.com/googleapis/google-api-go-client v0.0.0-20181220000619-583d854617afgoogle.golang.org/appengine => github.com/golang/appengine v1.3.0google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20181219182458-5a97ab628bfbgoogle.golang.org/grpc => github.com/grpc/grpc-go v1.17.0gopkg.in/alecthomas/kingpin.v2 => github.com/alecthomas/kingpin v2.2.6+incompatiblegopkg.in/mgo.v2 => github.com/go-mgo/mgo v0.0.0-20180705113604-9856a29383cegopkg.in/vmihailenco/msgpack.v2 => github.com/vmihailenco/msgpack v2.9.1+incompatiblegopkg.in/yaml.v2 => github.com/go-yaml/yaml v0.0.0-20181115110504-51d6538a90f8labix.org/v2/mgo => github.com/go-mgo/mgo v0.0.0-20160801194620-b6121c6199b7launchpad.net/gocheck => github.com/go-check/check v0.0.0-20180628173108-788fd7840127
)

主要包括:golang.org google.golang.org gopkg.in go.uber.org cloud.google.com 在下载包时会有timeout 导致编译失败,以上是对应的github库的替换。

七、go get的使用

使用go mod之后,go get拉取依赖的方式就发生了变化:
1、老的go get取包过程类似:git clone + go install , 开启Go Module功能后go get就只有git clone或者 download过程了。
2、新老实现还有一个不同是,两者存包的位置不同。前者,存放在$GOPATH/src目录下;后者,存放在$GOPATH/pkg/mod目录下。
3、老的go get取完主包后,会对其repo下的submodule进行循环拉取。新的go get不再支持submodule子模块拉取。

查看指定包可以下载的版本

go list -m -versions github.com/gogf/gf

下载项目依赖

go get ./...

拉取最新的版本(优先择取 tag)

go get golang.org/x/text@latest

拉取 master 分支的最新 commit

go get golang.org/x/text@master

拉取 tag 为 v0.3.2 的 commit

go get golang.org/x/text@v0.3.2

拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2:

go get golang.org/x/text@342b2e

指定版本拉取,拉取v3版本

go get github.com/smartwalle/alipay/v3

更新

go get -u

八、go mod与原GOPATH的区别

1、环境变量GOPATH不再用于解析imports包路径,即原有的$GOPATH/src/下的包,通过import是找不到了
2、Go Module功能开启后,下载的包将存放与$GOPATH/pkg/mod路径
3、$GOPATH/bin路径的功能依旧保持

总结

在Go1.11版本之前,依赖包管理一直是GOPATH的包管理方式,不太灵活方便,1.11版本发布后,带来了全新的go mod管理方式,用官方的话说,这是 GOPATH 的替代方案,集成了对版本控制和软件包分发的支持。可以看出借鉴了nodejs等包管理方式,项目的创建不再需要放在固定的$GOPATH/src/路径中,配合着国内的依赖包镜像源,体验很顺滑,推荐!

Go mod使用指南相关推荐

  1. [Stellaris][群星]Mod制作指南-附录

    [Stellaris][群星]Mod制作指南 附录 1. 触发器文档 导出自版本1.0.3 text - shows custom text Supported Scopes: ??? Support ...

  2. [Stellaris][群星]Mod制作指南-编写中-预计6月完成。。大概

    [Stellaris][群星]Mod制作指南 1. 引言 欢迎阅读本指南,本指南将尽可能全面地介绍群星Mod的制作方法,并以制作一个希灵帝国Mod的形式作为样例. 注:本文中如见"UTF-8 ...

  3. 方舟找不到mod服务器了,方舟生存进化灭绝MOD全图文攻略 方舟灭绝MOD上手指南_MOD介绍及服务器设置_游侠网...

    灭绝MOD是游戏中广受玩家好评的几个MOD之一,他有着大量的怪物和素材,这样就能够让玩家在游戏中体验到更多的新的内容,相对的想要在灭绝MOD当中生存的话也是有一定技巧的,所以这里我就给大家带来了&qu ...

  4. 杀戮尖塔用java也打不开_《杀戮尖塔》创意工坊使用指南以及mod推荐

    <杀戮尖塔>的创意工坊可谓是重新为这个游戏赋予了新的使命,而国内玩家想要游玩创意工坊的mod需要下载许多基础mod,但是很多人都不知道该下哪一种,导致mod不能玩,下面小编就将带来< ...

  5. allegro拉线特卡_如何拉线您的游戏PC:灯光,颜色和其他Mod指南

    allegro拉线特卡 So you've built yourself a powerful gaming PC, and even gotten a case with a side panel ...

  6. 算法竞赛进阶指南--快速幂,求a^b mod p

    // 快速幂,求a^b mod p int power(int a, int b, int p) {int ans = 1;for (; b; b >>= 1) {if (b & ...

  7. Mac上更新Go版本|Go Mod使用|避坑指南|

    mac更新go到最新版本 记录一下如何简单快捷(只需三步)的更新mac golang 到最新版本,适合任何版本的go 查看版本 > go version go version go1.17.4 ...

  8. VC倒下了我们还有其他MOD---天使驴快速使用指南

    来自: Mars panda 鉴于VC挂了,暂搜索到发布的资源途径减少,建议大家改用Xtreme或者在其基础上修改的scarangel. 重申一下,VC只是一个发布站点,其程序也只是电驴的其中一个mo ...

  9. Fedora下校园网上网指南(802.1xDrcom)

    发现很多人还在为上校园网的发愁,本文尽量提供详细的方法,但也不能保证全部可行,不过我在本机全部顺利测试通过.希望对有需要的人有所帮助! 一 校园网802认证客户端与使用 1.安装 下载下面的附件,然后 ...

最新文章

  1. 【问链-Eos公开课】第四课 EOS 的钱包创建、导入私钥
  2. html5 页面 参数传递,详解html中页面跳转传递参数的问题
  3. x11 gtk qt gnome kde 之间的区别和联系
  4. 腾讯总监周颢:亿级用户微信采用的架构宝典
  5. Tensorflow动态seq2seq使用总结
  6. python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...
  7. springboot-admin对springboot项目监控
  8. 《SSCOM串口/网络数据调试器》
  9. Spring Security Oauth2 JWT
  10. 文件、图片上传,下载预览的实现
  11. 浙江旅行新地标!图卷9号与法国著名建筑大师安东尼·贝叙共同打造
  12. Web前端密码加密是否有意义?
  13. Unix环境高级编程—进程控制(三)
  14. 身份证校验码程序c#
  15. WSL2 通过 USBIP 连接USB串口设备 JetsonUSB备份刷机
  16. Combo Box 组合框
  17. 编写第一个JSP文件
  18. 趣谈网络协议-第二模块-底层网络知识详解:4陌生的数据中心2CDN和数据中心
  19. shiro 权限框架
  20. openstack是什么

热门文章

  1. 线程池原理——高频面试题
  2. 那些年我们说过的110%战略
  3. 国产Linux系统deepin使用感受
  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛(1)个人解题报告
  5. 户外活动---英语单词
  6. python 0or2_Python表达式 0 and 1 or not 2True的值为(     )
  7. Android开发——NFC标签读写
  8. 探索5G - 回顾4G 给我们带来了哪些变化
  9. 提升堆头陈列产出的8个技巧
  10. 手把手教学搭建ntp服务器