go modules
go modules官方资料:https://github.com/golang/go/wiki/Modules
go版本控制发展史:
Go 1.5 Release之前
使用GOPATH,包管理、项目代码都依赖于GOPATH,项目代码位于GOPATH的src文件夹之下;
Go 1.5 Release到Go 1.10 Release
使用vender目录来管理包依赖(Go 1.5需要配置,Go 1.6及之后默认打开);
查找依赖包路路径的解决⽅方案如下:
- 当前包下的 vendor ⽬目录
- 向上级⽬目录查找,直到找到 src 下的 vendor ⽬目录
- 在 GOPATH 下⾯面查找依赖包
- 在 GOROOT ⽬目录下查找
常⽤用的依赖管理工具
godep https://github.com/tools/godep
glide https://github.com/Masterminds/glide
dep https://github.com/golang/dep
Go 1.11 Release到Go 1.13 Release
使用go modules模块(module-mode)进行依赖管理,在go1.11与go1.12要设置环境变量GO111MODULE=auto
启用module-mode;在go1.13中GO111MODULE=auto
为默认设置,即默认启用module-mode,不需要设置了。
go modules介绍
GO111MODULE=auto
启用,go 1.13默认启用,用于go项目的依赖管理。当编译、运行go项目时,若发现后缀有.mod
文件时即启用module-mode来编译、运行项目。使用module-mode后,项目目录不再需要放置于GOPATH/src目录下了(go1.13及其之后,使用module-mode的项目目录强制不能位于GOPATH目录之内)。
go moudles功能
1.自动添加import声明,如果
.go
文件中需要的模块;2.根据代码中import声明,go中的标准命令(go build,go run,go test等)会自动下载合适的依赖,并更新
go.mod
文件;3.通过命令go get [moduleName] @[moduleVersion](列如,
go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2
)来指定项目中所依赖的模块具体版本,也可以通过编辑go.mod
文件来指定以来版本go modules配置
GO111MODULE=auto
启用module-mode,即使用go modules管理项目依赖;go1.11,go1.12需要在环境变量中配置,go1.13为默认配置(并且禁止使用module-mod的项目目录存放在GOPATH下)。
GO111MODULE 环境变量:
- auto 或者不设置—默认设置,会根据执行命令的目录是否有
go.mod
文件来确定是否使用module-mode; - on — 执行命令的目录强制使用moudle-mode;
- off — 执行命令的目录强制不使用moudle-mode;
-
GOPRIVATE
如果需要使用自己或公司的私有代码库,则需要使用GOPRIVATE
配置私有库或项目的地址。
例如:
go env -w GOPRIVATE=*.corp.com,github.com/secret/repo
-
GONOPROXY
设置默认下载依赖的公有Go模块镜像的代理地址,默认为https://proxy.golang.org;其它的代理地址可以查看(details) -
GONOSUMDB
设置与本地下载的go依赖进行对比校验的公共校验数据库代理地址,默认为 https://sum.golang.org
go modules使用
1、开启go modules并设置反向代理
上面已说过,go1.13以上版本GO111MODULE默认已自动开启,不需要重新设置;反向代理主要用来解决获取包时的网络限制,需要设置一下
linux环境下,再终端输入:
export GO111MODULE=auto
export GOPROXY=https://goproxy.io
不过这种是一次性的,重启之后就会消失,所以可以在环境信息文件/etc/profile
的最后面添加上下面这两行,最后使用source /etc/profile
让其生效
windows环境下设置,在系统环境变量中新增GO111MODULE和GOPROXY,如下图:
另外一种方法是使用Goland IDE vgo,设置如下:
2、在GOPATH 之外的地方,新建一个空文件夹go-mod-test,执行go mod init命令初始化(注意cd到go-mod-test目录下)
go mod init初始化命令会在当前目录下生成一个go.mod文件,内容如下:
3、添加依赖包,以gin为案例,gin传送门https://github.com/gin-gonic/gin
在目录中创建一个 main.go
的文件,放上如下代码(代码为gin官方启动实例):
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") }
4、执行go mod tidy命令(也可以执行:go build/go run),执行完成后,看一下 go.mod
文件
看到新增一个 gin v1.5.0 的包,还发现目录下成了一个 go.sum 的文件,这个文件可以暂时先不管
此时,你可能很好奇,目录中没发现 gin 包,包下载到哪了?
下载到了 GOPATH/pkg/mod 目录中
5、go run main.go运行一下,在浏览器中输入:localhost:8080/ping,运行效果如下
搞清楚go modules用法后,顿时感觉go包管理方便了好多,可以脱离GOPATH创建项目了,同时包可以指定特定版本了,
反向代理的设置终于摆脱网络限制了,之前很多包由于网络原因下载不下来,简直是噩梦啊
go modules常见命令:
go mod init: 初始化modules
go mod download: 下载依赖的module到本地cache
go mod edit: 编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph: 以文本模式打印模块需求图
go mod tidy: 检查,删除错误或者不使用的modules,以及添加缺失的模块
go mod vendor: 生成vendor目录,将依赖复制到vendor目录下面
go mod verify: 验证依赖是否正确
go mod why: 解释为什么需要依赖
go list -m: 查看主模块的路径
go list -m -f={{.Dir}}: 查看主模块的根目录
go list -m all: 查看当前的依赖和版本信息
命令使用:
1、go list -m all //列出项目使用的依赖包
2、go list -m -versions github.com/gin-gonic/gin //查看依赖的版本历史
3、go get github.com/gin-gonic/gin@v1.4.0 //依赖包更新到指定版本
4、go mod edit -require="github.com/gin-gonic/gin@v1.4.0" // 修改 go.mod 文件(从v1.5.0变成了v1.4.0)
5、go mod tidy //下载更新依赖
原文地址:https://www.cnblogs.com/marshhu/p/11961476.html
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- 第一个IronPython程序(之二)
- Python 项目实践二(下载数据)第四篇
- Python 项目实践二(下载数据)第三篇
- 体验扁平化的WordPress 后台管理界面
- Python 项目实践二(生成数据)第二篇
- 重新审视SqlDataReader的使用
- Python 项目实践二(生成数据)第一篇
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
- 自定义(修改)WordPress管理后台界面的字体样式
- Sql Server 2005 ROW_NUMBER 函数实现分页
- Http协议中的数据传送之多重表单提交--multipart/form-data
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在StackBlitz上setup SAP Spartacus
- [898]python获取两个list交集|并集|差集
- [897]使用Maxwell实时同步mysql数据
- Magicodes.IE之导入导出筛选器
- 一文搞懂Flink生成StreamGraph
- 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一
- ESP8266和ROS调试一些问题汇总
- tianbot_mini机器人上手ROS/SLAM/Navigation究竟有多简单???
- 如何知道我们的E2E测试覆盖率?
- tf.add_n函数的用法
- tensorflow 生成指定大小的赋值0的张量 np.zeros 在TF中对应的语句 生成全0张量
- Qt音视频开发25-ffmpeg音量设置
- 从HelloWorld开始了解Android
- 探究活动Activity
- 探究活动Activity(2)界面跳转及生命周期