go mod 和 govendor 都是 Go 包管理器,类似 Java 工程的 maven

  • 2012年3月 Go 1 发布,此时没有版本的概念
  • 2013年 Golang 团队在 FAQ 中提议开发者保证相同 import path 的兼容性,后来成为一纸空文
  • 2013年10月 Godep
  • 2014年7月 glide
  • 2014年 有人提出 external packages 的概念,在项目的目录下增加一个 vendor 目录来存放外部的包
  • 2015年8月 Go 1.5 实验性质加入 vendor 机制
  • 2015年 有人提出了采用语义化版本的草案
  • 2016年2月 Go 1.6 vendor 机制 默认开启
  • 2016年5月 Go 团队的 Peter Bourgon 建立委员会,讨论依赖管理工具,也就是后面的 dep
  • 2016年8月 Go 1.7: vendor 目录永远启用
  • 2017年1月 Go 团队发布 Dep,作为准官方试验
  • 2018年8月 Go 1.11发布 Modules 作为官方试验
  • 2019年2月 Go 1.12发布 Modules 默认为 auto
  • 2019年9月 Go 1.13 版本默认开启 Go Mod 模式

有这么个故事

故事:失宠的 Vendor 目录

Vendor目录是Golang从1.5版本开始引入的,为项目开发提供了一种离线保存第三方依赖包的方法。但是到了Golang 1.11之后,由于引入了Module功能,在运行go build时,优先引用的是Module依赖包的逻辑,所以Vendor目录就被“无视”了,进而可能发生编译错误, moudle 说还是很想他,于是 提供了 go mod vendor 命令用来生成 vendor 目录。这样能避免一些编译问题,依赖可以先从 vendor 目录进行扫描。

$ go mod help vendor
usage: go mod vendor [-v]Vendor resets the main module's vendor directory to include all packages needed to build and test all the main module's packages.
It does not include test code for vendored packages.

这句话的意思是: 把 go mod init 后下载的相关依 赖包(Gopath 的 pkg) 目录,拷贝到 vendor 目录。

vendor 目录方式

go vendor 是go 1.5 官方引入管理包依赖的方式

基本思路: 将引用的外部包的源代码放在当前工程的vendor目录下面,go 1.6以后编译go代码会优先从vendor目录先寻找依赖包;找不到再从GOPATH 中寻找

解决的问题

将源码拷贝到当前目录下,这样导包当前工程代码到任意的机器的 ¥GOPATH/src 都可以编译通过,避免项目代码外部依赖过多

未解决的问题

无法精确的引用 外部包进行版本控制,不能指定引用某个特定版本的外部包,只是在开发时将其拷贝过来,但是一旦外部包升级,vendor 下面的包会跟着升级,而且 vendor 下面没有完整的引用包的版本信息, 对包升级带来了无法评估的风险。

什么是 GOROOT 和 GOPATH

  • GOROOT: golang的安装路径,当安装好go之后,默认会安装在/usr/local/go之下。GOROOT的主要作用是标识go的当前安装位置。
  • GOPATH: 存放SDK以外的第三方类库;收藏的可复用的代码,包含三个子目录:
    – src : 存放项目源码文件
    – pkg : 编译后的包文件
    – bin :编译后生成的可执行文件

要解决 vendor 目录 未解决的问题,使用 govendor

  • 可以平滑的将现有非 vendor 项目转换成 vendor 项目
govendor add  inport_out_packagename
  • 会生成一个元数据文件,记录工程依赖的外部包,及其版本信息
vendor.json
  • 提高命令查看整个工程的依赖关系
goverdor --list
goverdor --list -v

govendor

govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具。与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本、以及无相互侵入的开发和管理。

在执行 go build 或 go run 命令时,会按照以下顺序去查找包:

  • 当前包下的 vendor 目录
  • 向上级目录查找,直到找到 src 下的 vendor 目录
  • 在 GOROOT 目录下查找
  • 在 GOPATH 下面查找依赖包

常用命令


状态参数

  1. 安装
go get -u -v github.com/kardianos/govendor
  1. 初始化
cd xxx
govendor init

初始化完成后,项目目录中会生成一个vendor文件夹,包含一个vendor.json文件,json文件中包含了项目所依赖的所有包信息

{"comment": "","ignore": "test","package": [],"rootPath": "govendor-example"
}

将已被引用且在 $GOPATH 下的所有包复制到 vendor 目录

govendor add +external

仅从 $GOPATH 中复制指定包

govendor add gopkg.in/yaml.v2

列出代码中所有被引用到的包及其状态

govendor list

运行结果

e  github.com/gin-contrib/ssee  github.com/gin-gonic/gine  github.com/gin-gonic/gin/bindinge  github.com/gin-gonic/gin/internal/jsone  github.com/gin-gonic/gin/rendere  github.com/golang/protobuf/protoe  github.com/mattn/go-isattye  github.com/ugorji/go/codece  gopkg.in/go-playground/validator.v8e  gopkg.in/yaml.v2
pl  govendor-examplem github.com/json-iterator/gom golang.org/x/sys/unix

列出一个包被那些包引用

govendor list -v fmt
 s  fmt├──  e  github.com/gin-contrib/sse├──  e  github.com/gin-gonic/gin├──  e  github.com/gin-gonic/gin/render├──  e  github.com/golang/protobuf/proto├──  e  github.com/ugorji/go/codec├──  e  gopkg.in/go-playground/validator.v8├──  e  gopkg.in/yaml.v2└── pl  govendor-example

使用建议

  • 使用govendor管理项目并进行项目协作时,我们每次不需要提交整个vendor目录,而只需要提交json文件,十分方便。一个配置文件全部搞定!
  • vendor 目录解决了工程依赖打包的问题,可将依赖与工程一起打包,减少下载依赖的时间。
  • 同一个项目只创建一个govendor目录,且在代码库的一级目录。

缺点

  • 依赖包全部都在vendor目录下,每个项目都有一份,所以每次拉取项目时都会拉一遍依赖。
  • govendor不区分包版本,意味着开发期间拉的依赖的包很可能跟上线后的拉的依赖包版本不一致,很危险。
  • govendor add +e会拉取全部外部包,即使是本项目没有用到的,这样会造成大量的冗余。但是只用govendor add +指定包又很麻烦。

go mod

go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

包不再保存在GOPATH中,而是被下载到了$GOPATH/pkg/mod路径下.

go mod vendor 会将依赖包放到 vendor 目录

  • go.mod文件记录了项目所有的依赖信息,其结构大致如下:
module github.com/Q1mi/studygo/bloggergo 1.12require (github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586github.com/gin-gonic/gin v1.4.0github.com/go-sql-driver/mysql v1.4.1github.com/jmoiron/sqlx v1.2.0github.com/satori/go.uuid v1.2.0google.golang.org/appengine v1.6.1 // indirect
)
  • go.sum是一个构建状态跟踪文件。它会记录当前module所有的顶层和间接依赖,以及这些依赖的校验和,来确保这些模块的将来下载内容与第一次下载的内容相同,但是第一次下载的模块也有可能是非法的(代理服务不可信、模块源被黑等),所以Go 1.13推出GOSUMDB(Go CheckSum Database)用来公证模块的Hash值,从而提供一个可以100%复现的构建过程并对构建对象提供安全性的保证,同时还会保留过去使用的包的版本信息,以便日后可能的版本回退。

go mod

go mod 与 go vendor 区别

内推链接

欢迎关注公众号:程序员财富自由之路

参考资料

  • https://studygolang.com/articles/8298
  • https://zhuanlan.zhihu.com/p/59191567
  • https://shockerli.net/post/go-package-manage-tool-govendor/
  • https://www.liwenzhou.com/posts/Go/go_dependency/
  • https://wangxiaoming.blog.csdn.net/article/details/113665107
  • https://segmentfault.com/a/1190000019724582
  • https://www.cnblogs.com/youhui/articles/11152843.html

go mod 与govendor 使用与区别相关推荐

  1. java中jmod是什么,modulo - j中mod的语法是什么

    modulo - j中mod的语法是什么 作为伪代码的一个例子: if ((a mod 2) == 0) { isEven = true; } else { isEven = false; } 15个 ...

  2. MATLAB常用语句(1)---rem 和mod

    rem 和 mod (除后的余数) 语法: r=rem(a,b) ; b=mod(a,m) 其中 a 是被除数: 被除数,指定为标量.向量.矩阵或多维数组.a 必须是任意数值类型的实数值数组.数值输入 ...

  3. Go mod使用指南

    转自:https://studygolang.com/articles/31112?fr=sidebar 一.启用go mod go env -w GO111MODULE=on #开启 MODULE ...

  4. 取模是什么意思python_编程语言中,取余和取模的区别到底是什么?

    取余,遵循尽可能让商向0靠近的原则取模,遵循尽可能让商向负无穷靠近的原则符号相同时,两者不会冲突. 比如,7/3=2.3,产生了两个商2和37=3*2+1或7=3*3+(-2).因此,7rem3=1, ...

  5. Golang使用go mod 导入本地库

    Golang使用go mod 导入本地库(结合goland编译器) 主要分为两种情况:一种是在同一个项目下导入,一种是两个不同项目 我的gopath路径在D:gowork 同一个项目导入 这种情况是不 ...

  6. GEE开发之Modis_NPP数据分析和获取

    GEE开发之Modis_NPP数据分析和获取 1.NPP 2.MOD系列和MYD系列区别 3.MOD17A3H_v006(500m/1年) 4.MOD17A3HGF_v006(500m/1年) 5.M ...

  7. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  8. abap 中的语法 div / mod 的用法区别

    在abap的开发过程中,用到div./.mod的时候并不是很多,除非要进行数据处理的时候才有可能用到它们了,下面介绍一下他们之间的用法与区别: 1.div div是用于取两数相除的商的,c = a d ...

  9. hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:(注意题目中的%是指mod)开始给了你n, k, m....每次由+m, -m, *m, ...

最新文章

  1. Codeforces Round #308 (Div. 2) C. Vanya and Scales dfs
  2. 10.Stream流
  3. 维修技嘉B250M-DS3H不开机一例
  4. 【图】一只Android开发程序猿对IMの所有痴情,你会懂?
  5. SendMail与Postfix的架构备忘2
  6. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之数据篇
  7. 大话重构连载9:大布局你伤不起
  8. SpringBoot 日志配置
  9. Latex入门——使用vscode实时编辑latex文档
  10. 某大型园区综合布线方案设计(转载)
  11. Flash builder 4.7 离线安装svn
  12. 深度学习模块介绍 —— Hourglass Module
  13. 正版口腔管理软件免费使用,口腔诊所业绩提升就靠它
  14. kaggel竞赛之员工离职分析
  15. pycharm 隐藏或显示文件类型
  16. Ubuntu18.04安装坚果云
  17. 2013 NMPD展示预览,第1部分
  18. Kinect v2保存图像和深度图序列
  19. c语言 重新输入,C语言函数重新输入
  20. 免费PDF批量转换图片工具

热门文章

  1. 残联组织残疾人计算机考证二级培训班
  2. 常用JS图片滚动(无缝、平滑、上下左右滚动)
  3. mysql死锁查询语句
  4. 经典MATLAB电子书免费下载
  5. Android如何确定显示图标
  6. Linux ls指令
  7. 我的 PHP 工具类库
  8. 中高级PHP程序员应该掌握哪些技术?
  9. 提高文章吸引力:一键生成精彩标题
  10. html页面中DIV高度100%设置问题