go module基本使用
前提
go版本为1.13及以上
官方文档
如果你想更深层次的了解GO MODULE的意义及开发者们的顾虑,可以直接访问官方文档(EN)
https://github.com/golang/go/wiki/Modules
go module介绍
go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用
Go module 构建模式是在 Go 1.11 版本正式引入的,为的是彻底解决 Go 项目复杂版本依赖的问题,在 Go 1.16 版本中,Go module 已经成为了 Go 默认的包依赖管理机制和 Go 源码构建机制。
go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等
使用go module之后我们可不用将代码放置在src下了,module 隐含了一个命名空间的概念,module 下每个包的导入路径都是由 module path 和包所在子目录的名字结合在一起构成。
使用 go module 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum。
go.mod 中会记录当前项目的所依赖的包的信息,文件格式如下所示:
module github.com/gosoon/audit-webhook
go 1.12
require (
github.com/elastic/go-elasticsearch v0.0.0
github.com/gorilla/mux v1.7.2
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81
)
go.sum记录每个依赖库的版本和哈希值,用来校验本地包的真实性。
在构建的时候,如果本地依赖包的 hash 值与 go.sum 文件中记录的不一致,就会被拒绝构建。
文件格式如下所示:
github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA=
github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg=
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81 h1:JP0LU0ajeawW2xySrbhDqtSUfVWohZ505Q4LXo+hCmg=
github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81/go.mod h1:1e0N9vBl2wPF6qYa+JCRNIZnhxSkXkOJfD2iFw3eOfg=
开启go module
在 go1.16 版本发布后,go module 由原来的默认值auto 变为on 了,意味着 go module 默认已经开启了
如果你的 go 版本小于 1.16 需要进行以下配置,以打开 go module
(1) go 版本 >= v1.11
(2) 设置GO111MODULE环境变量
要使用go module 首先要设置GO111MODULE=on,GO111MODULE 有三个值,off、on、auto,off 和 on 即关闭和开启,auto 则会根据当前目录下是否有 go.mod 文件来判断是否使用 modules 功能。无论使用哪种模式,module 功能默认不在 GOPATH 目录下查找依赖文件,所以使用 modules 功能时请设置好代理。
在使用 go module 时,将 GO111MODULE 全局环境变量设置为 off,在需要使用的时候再开启,避免在已有项目中意外引入 go module。
windows:
set GO111MODULE=on
// 第二种
go env -w GO111MODULE=on
mac:
export GO111MODULE=on
然后输入
go env
查看 GO111MODULE 选项为 on 代表修改成功
GO PROXY
Goland 使用 go mod 时,一定要记得配置代理(Preferences>Go>Go Modules>Environment GOPROXY=https://goproxy.cn,direct)
go module 的目的是依赖管理,所以使用 go module 时你可以舍弃 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平时没有必要使用)
因go的网络问题, 所以推荐使用 goproxy.cn设置
// 阿里云镜像
GOPROXY=https://mirrors.aliyun.com/goproxy/
// 中国golang镜像
GOPROXY=https://goproxy.io
// 七牛云为中国的gopher提供了一个免费合法的代理goproxy.cn,其已经开源。只需一条简单命令就可以使用该代理:
go env -w GOPROXY=https://goproxy.cn,direct
初始化
为你的项目第一次使用 GO MODULE(项目中还没有go.mod文件)
进入你的项目文件夹
cd xxx/xxx/test/
初始化 MODULE
go mod init test(test为项目名)
我们会发现在项目根目录会出现一个 go.mod 文件
注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了
检测依赖
go mod tidy
tidy会检测该文件夹目录下所有引入的依赖,写入 go.mod 文件
写入后你会发现 go.mod 文件有所变动
例如:
module test
go 1.13
require (
github.com/gin-contrib/sessions v0.0.1
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.4.0
github.com/go-redis/redis v6.15.6+incompatible
github.com/go-sql-driver/mysql v1.4.1
github.com/golang/protobuf v1.3.2 // indirect
github.com/jinzhu/gorm v1.9.11
github.com/json-iterator/go v1.1.7 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/mattn/go-isatty v0.0.10 // indirect
github.com/sirupsen/logrus v1.2.0
github.com/ugorji/go v1.1.7 // indirect
golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect
gopkg.in/yaml.v2 v2.2.4
)
此时依赖还是没有下载的
下载依赖
我们需要将依赖下载至本地,而不是使用 go get
go mod download
如果你没有设置 GOPROXY 为国内镜像,这步百分百会卡到死
此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖, 但是我们开头说了,我们的项目是没有放到 GOPATH 下的,那么我们下载至 GOPATH 下是无用的,照样找不到这些包
导入依赖
go mod vendor
执行此命令,会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下, 此时我们就可以使用这些依赖了
goland设置开启 Go Module
可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)
打开设置Go->打开折叠->选择Go Modules(vgo)->选中两个复选框,在Proxy选择框中填入镜像源
依赖更新
这里的更新不是指版本的更新,而是指引入新依赖
依赖更新请从检测依赖部分一直执行即可,即
go mod tidy
go mod download
go mod vendor
使用go get 升级依赖
- 升级 major 版本:
go get -u github.com/xxx/xxx - 升级全部依赖的 minor 或 patch 版本:
go get -u - 升级全部依赖的 patch 版本:
go get -u=patch
Major:具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。
Minor:如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。
Patch:指系统或软件的补丁,是为了完善系统或开发的软件而开发的程序或代码。
Build:内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。
Revision:名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。
新增依赖
有同学会问,不使用 go get ,我怎么在项目中加新包呢?
直接项目中 import 这个包,之后更新依赖即可
使用 go get 添加依赖
- 添加依赖
go get github.com/xxx/xxx - 添加指定版本:
go get github.com/xxx/xxx@v1.6.2 - 添加指定版本范围:
go get github.com/xxxx/xxx@'<v1.6.2' - 添加指定commit的版本
git commit: go get github.com/xxxx/xxx@q2516faf3
在协作中使用 GO MODULE
要注意的是, 在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大
git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件
设置忽略即可.
但是 go.mod 和 go.sum 不要忽略
另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可
GOMODULE常用命令
go mod init # 初始化go.mod
go mod tidy # 更新依赖文件
go mod download # 下载依赖文件
go mod vendor # 将依赖转移至本地的vendor文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
go module基本使用的更多相关文章
- Android Studio 编译单个module
前期自己要把gradle环境变量配置好 在Terminal中gradle命令行编译apk 输入gradle assembleRelease 会编译全部module编译单个modulecd ./xiru ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
- nodejs模块中exports和module.exports的区别
通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...
- ES6之module
该博客原文地址:http://www.cnblogs.com/giggle/p/5572118.html 一.module概述 JavaScript一直没有模块体系,但是伴随着ES6的到来,modul ...
- [python] CSV read and write using module xlrd and xlwt
1. get data from csv, skip header of the file. with open('test_data.csv','rb,) as csvfile: readCSV = ...
- Yii2.0.7 限制user module登录遇到的问题
在Yii2.0.6的时候我是在以下文件通过以下方法实现的. frontend/modules/user/Module.php namespace frontend\modules\user; clas ...
- Android Studio导入github下载的project和module
前言:我们以前eclispe时代, 经常都是跑到github浏览第三方开源资源,然后下载下来,运行一下sample之类的,学习没有接触的第三方安卓库,但是到了Android Studio,在githu ...
- Android Studio导入Project、Module的正确方法
Gradle Project项目.Module模块导入 最近看到网上很多人在抱怨,Android Studio很难导入github上下载下来的一些项目,主要包括: 1.导入就在下载Gradle2.根本 ...
- ImportError: No module named 'requests'
补充说明: 当前环境是在windows环境下 python版本是:python 3.4. 刚开始学习python,一边看书一边论坛里阅读感兴趣的代码, http://www.oschina.net/c ...
- android studio 中移除module和恢复module
一.移除Android Studio中module 在Android Studio中想要删除某个module时,在Android Studio中选中module,右键发现没有delete,如图: An ...
随机推荐
- Qt音视频开发09-ffmpeg内核音视频同步
一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如 ...
- Qt开源作品25-电池电量控件
一.前言 现在这个时代,智能手机不要太流行,满大街都是,甚至连爷爷奶奶级别的人都会用智能手机,本次要写的控件就是智能手机中的电池电量表示控件,采用纯painter绘制,其实也可以采用贴图,我估计大部分 ...
- Qt开源作品10-代码统计组件
一.前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行.注释行.代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计.写完这个工具第一件事情就 ...
- Javascript中不同的<script.../>元素中变量或函数的作用范围的说明
在同一个<script.../>元素中,Javascript允许先调用函数,然后再定义该函数:但是在不同的<script.../>元素中,必须先定义函数,再调用该函数,也就是说 ...
- 直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
本文由vivo互联网技术团队LinDu.Li Guolin分享,有较多修订和改动. 1.引言 IM即时消息模块是直播系统的重要组成部分,一个稳定.有容错.灵活的.支持高并发的消息模块是影响直播系统用户 ...
- 【转载】hacker术语
1.肉鸡 所谓"肉鸡"是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是WINDOWS系统,也可以是UNIX/LINUX系统,可以是普通的个人电脑,也可以是大型的服务 ...
- c# 设置WebBrowser的UserAgent
void SuppressScriptErrors(WebBrowser webBrowser, bool hide) { webBrowser.Navigating += (s, e) => ...
- Mongodb 基础与安装
官网链接:https://docs.mongodb.com/ 参考链接:https://www.runoob.com/mongodb/mongodb-linux-install.html 1.什么是M ...
- Java虚拟机调优-典型配置举例
背景: 以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的 ...
- Mongodb使用手册-文档存储
简介 MongoDB 是一个基于分布式文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自由 ...