Go modules 简介
Go modules 简介
Golang的版本管理视频推荐:Go with Versions - GopherConSG 2018
官网Wiki介绍:github.com/golang/go/wiki/Modules
1个开关环境变量:GO111MODULE
5个辅助环境变量:GOPROXY、GONOPROXY、GOSUMDB和GOPRIVATE
2个辅助概念:GO module proxy和GO checksum database
go.mod
go.mod是启动了Go modules的项目送必须的最重要的文件,它描述了当前项目的元信息,每一行都以一个动词开头,目前有5个动词:
- module:用于定义当前项目的模块路径
- go: 用于设置预期的Go版本
- require:用于需求一个特定的模块版本
- exclude:用于从使用中排除一个特定的模块版本
- replace:用于将一个模块版本替换为另一个模块版本。
go.sum
go.sum详细罗列了当前项目直接或者间接依赖的所有模块,并写明了那些模块版本的SHA-256哈希值以备Go在季后的操作中保证项目所依赖的那些模块版本不会被篡改。
GO111MODULE
一共有三个值:
- auto:只在项目包含了go.mod文件时启用Go modules,在Go1.13中仍然是默认值,详见:golang.org/issue/31857
- on:启用Go modules
- off:禁用Go modules
GOPROXY
它的值是一个以英文逗号分割的Go module proxy列表,用于使Go在后续拉取模块版本时能脱离传统的VCS方式从镜像站点快速拉去,它的值也可以是 off
,即禁止Go从任何地方拉去模块版本。
go env -w GOPROXY=https://goproxy.cn,direct
常见的坑
主版本号问题
Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循v..的格式,此外,如果major版本号大于1时,其版本号还需要体现在Module名字中。
比如Module github.com/yankooo/yaml
,如果其版本号增长到v2.x.x时,其Module名字也需要相应的改变为: github.com/yankooo/yaml/v2
。即,如果major版本号大于1时,需要在Module名字中体现版本。
以Module github.com/yankooo/yaml
为例,比如当前版本为 v2.3.0
,因为其Module名字未遵循Golang所推荐的风格,即Module名中附带版本信息,我们称这个Module为不规范的Module。
不规范的Module还是可以引用的,但跟引用规范的Module略有差别。
如果我们在项目A中引用了该module,使用命令go mod tidy,go 命令会自动查找Module m的最新版本,即v2.3.0。 由于Module为不规范的Module,为了加以区分,go 命令会在go.mod中增加+incompatible 标识。
require (
github.com/yankooo/yaml v2.3.0+incompatible
)
除了增加+incompatible(不兼容)标识外,在其使用上没有区别。
- HDUOJ-------2493Timer(数学 2008北京现场赛H题)
- go sync.Mutex 设计思想与演化过程 (一)
- HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)
- HDUOJ----2485 Destroying the bus stations(2008北京现场赛A题)
- Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑
- Node.js真的无所不能?那些不适用的应用领域分析
- hdu-----2491Priest John's Busiest Day(2008 北京现场赛G)
- nyoj------79拦截导弹
- HDUOJ-------2719The Seven Percent Solution
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- uva----11729 Commando war (突击战争)
- uva-----11292 The Dragon of Loowater
- golang简单位运算示例
- 学编程,学单词.....在学习中积累自己的单词(不断更新__ing)
- 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 数组属性和方法
- Yii框架通过请求组件处理get,post请求的方法分析
- PHP实现单文件、多个单文件、多文件上传函数的封装示例
- Android自定义控件单位尺寸实现代码
- Android中socket通信的简单实现
- Thinkphp5框架使用validate实现验证功能的方法
- Android通过Java sdk的方式接入OpenCv的方法
- php+js实现的无刷新下载文件功能示例
- Android如何获取视频首帧图片
- PHP单文件上传原理及上传函数的封装操作示例
- php中错误处理操作实例分析
- Android 百度地图定位实现仿钉钉签到打卡功能的完整代码
- Thinkphp5框架实现图片、音频和视频文件的上传功能详解
- Android使用Opengl录像时添加水印
- Laravel使用Queue队列的技巧汇总
- Thinkphp5框架ajax接口实现方法分析