介绍

go dep 依赖管理工具是为应用管理代码的,go get是为GOPATH管理代码的

官方地址

官方说明为啥要统一依赖管理

dep 需要在Go 1.7及更高的版本中使用

安装

本文使用 golang 版本是 go1.9.3 需要自己安装 dep

go get -v -u github.com/golang/dep/cmd/dep

基础帮助参数

dep
Dep is a tool for managing dependencies for Go projects
Usage: "dep [command]"
Commands:init Set up a new Go project, or migrate an existing onestatus Report the status of the project's dependenciesensure Ensure a dependency is safely vendored in the projectprune Pruning is now performed automatically by dep ensure.version Show the dep version information
Examples:dep init set up a new projectdep ensure install the project's dependenciesdep ensure -update update the locked versions of all dependenciesdep ensure -add github.com/pkg/errors add a dependency to the project
Use "dep help [command]" for more information about a command.

ensure 确保,确保所有本地状态-代码树、依赖列表、锁、远端oss彼此同步

使用

初始化

dep init -v # 更建议使用,因为会很漫长

会生成两个文件 Gopkg.lockGopkg.toml 和一个目录 vendor

如果报错 Gopkg.toml and Gopkg.lock are out of sync 需要执行一下 dep ensure -v

其中
  • Gopkg.toml 是依赖管理的核心文件,可以生成也可以手动修改,Gopkg.toml 官方文档
  • Gopkg.lock 是生成的文件,不要手工修改 Gopkg.lock 官方文档
  • vendor 目录是 golang1.5 以后依赖管理目录,这个目录的依赖代码是优先加载的,类似 node 的 node_module 目录.

依赖管理

# 依赖管理帮助
dep help ensure
# 添加一条依赖
dep ensure -add github.com/bitly/go-simplejson
# 这里 @= 参数指定的是 某个 tag
dep ensure -add github.com/bitly/go-simplejson@=0.4.3
# 添加后一定记住执行 确保 同步
dep ensure
# 同理建议使用
dep ensure -v
# 更新依赖
dep ensure -update -v
#  删除没有用到的 package
dep prune -v

依赖更新

编辑 Gopkg.toml 文件,配置新的依赖,然后执行

dep ensure -update -v && dep ensure -v

注意,这个和更新依赖是完全不同的概念,因为 dep 依赖 vendor 目录,所以会出现一种奇怪的情况
toml 文件修改了,但是依赖没有在 vendor 目录出现,这点你需要学习 node_module 修复大法
删除 vendor 目录中对应的内容,或者干掉整个 vendor 目录

dep 管理存在的问题

  • 远程仓库拉取会比较困难,比如 golang.org 的,这个你得自己想办法,比如使用镜像,或者把依赖扔 vendor 目录
  • 因为可以发现跨模块的代码拷贝,导致拉取依赖失败,因为 dep 是拷贝仓库代码,报错会比较摸不到头脑,建议仔细比对日志
  • 因为 go 的依赖管理实际就是 git 的仓库拉取,如果依赖的仓库没有打 tag, 那么dep 会使用离 HEAD 提交最近的一次 tag,导致编译经常不通过.

临时解决方法是修改 Gopkg.toml 将有问题的仓库 version 注释掉,branch 切换到可以的分支

[[constraint]]branch = "master"name = "github.com/xx/xxx"#version = ""

最好的方法还是给依赖仓库打 tag

持续集成使用 dep 管理依赖

这里就不介绍一个 dep 管理实例了,因为环境不一样,使用的CI CD链不一样,除了脚本可以通用,其他内容都超过了本文的范围,所以主要讲些原则上的事情

持续集成时,使用 dep 的基本原则
  • 尽量使用 tag 作为版本号,不使用分支(tag 就是不可维护分支,能固化版本,分支没有这个能力)
  • 禁止非 vendor 依赖方式编译
  • 使用 Makefile 或者 shell 控制集成过程
  • 参数化部署控制,做好 测试 灰度 生产的分离,这里推荐 viper 参数配置工具

代码提交版本管理

  • Gopkg.tomlGopkg.lock 全部 vendor 目录都提交,git 仓库压力很大,但是可以做到减少远程依赖.

    这种方式可以做到开箱即用

  • 让工程只保留 Gopkg.tomlGopkg.lock,减少仓库代码大小,降低仓库压力
    这种方式,每次构建就得执行 dep ensure -v

我倾向于选择提交全部 vendor, 原因是远程仓库的依赖拉取非常慢,容易拖慢构建
如果git 仓库压力很大,可以做缓存仓库迁移分离压力,当然得写脚本批量修改 golang 代码的引用

当然你还有一个选择,将 vendor 做成一个共享目录,编译时挂载到编译工程,这样既让 git 仓库的压力变小,也不被远程仓库网速问题困扰,缺点就是得额外维护脚本

构建过程的控制

  • 因为 ${GOPATH} 环境变量的特殊性,不建议直接使用类似 jenkins 这种虚拟命令行构建,容易导致各种混乱(复数GOPATH,虽然可行,但存在环境串扰,降低编译速度,甚至报错的问题)
  • 使用 docker 临时容器构建,输出构建的目标二进制和报告作为结果是最好的选择
  • 如果是服务型的构建,可以直接使用 docker 容器编排测试服务

docker容器服务构建样例

golang 官方依赖管理工具 dep 使用和持续集成相关推荐

  1. go之官方依赖管理工具dep安装和使用

    前言 大家都知道go没有一个自己的包管理平台.社区里go的第三方包托管在各个git托管平台.需要用到包时通过go get 命令工具安装,但这个工具没有版本描述性文件,在go的世界里没有"pa ...

  2. dep指定版本 go_Go依赖管理工具 - dep

    Go依赖管理工具 Go dependency management tool 环境要求 Golang >= 1.9 Dep 目前版本: dep: version : devel build da ...

  3. Golang依赖管理工具:glide从入门到精通使用

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰的Maven和Gradle. G ...

  4. linux go vendor目录,Go 包依赖管理工具 —— govendor

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

  5. 小白都能看懂的go语言包管理工具DEP详解

    简介 众所周知GO语言包管理工具百花齐放,前有godep.glide.govendor,后有dep. 今天我们来了解一下"dep",看看它是怎样实现包管理的. dep安装 二进制文 ...

  6. GO 依赖管理工具go Modules

    以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是"official experiment&quo ...

  7. go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod

    Go Module是Go会在1.12中正式推出的包管理机制. Go mod 简介 Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具.从我个人的角度上来看存在两个问题: GOPATH ...

  8. dep指定版本 go_Go 包管理工具-dep

    dep 是一个 golang 依赖管理工具,需要在 Go 1.7 及更高的版本中使用. 1. 安装 安装 dep 工具的方式有很多种,如果是 mac 电脑的话,只需要如下命令: brew instal ...

  9. NPM:nodejs官方包管理工具的简介、安装、使用方法之详细攻略

    NPM:nodejs官方包管理工具的简介.安装.使用方法之详细攻略 目录 NPM之nodejs官方包管理工具的简介 NPM之nodejs官方包管理工具的安装 NPM之nodejs官方包管理工具的使用方 ...

最新文章

  1. iOS SwiftUI篇-6 专题TabView
  2. python与Redis数据库进行交互(安装包、调用模块、StrictRedis对象⽅法、交互代码示例(string增加、string获取、string修改、string删除、获取键))
  3. 一个登录框实现不同的登录验证
  4. HeadFirst设计模式篇十:状态模式
  5. memcache分布式 [一致性hash算法] 的php实现
  6. 2020年十大数据中心行业趋势
  7. python元编程之使用动态属性实现定制类--特殊方法__setattr__,__getattribute__篇
  8. Win11系统各个版本之间的比较,看完你就懂了!
  9. 智能投影:下一个传统投影的颠覆者
  10. m-qam matlab,基于matlab的M_QAM通信系统仿真.doc
  11. 面向接口编程在Java web 三层架构的应用与使用工厂模式解决问题
  12. Laravel的CURD操作
  13. Open×××多处理之-为什么不
  14. Funcode实现黄金矿工
  15. java 异步发送消息_Java模拟异步消息的发送与回调
  16. openflow通信流程总结
  17. 【概率论与数理统计(研究生课程)】知识点总结6(抽样分布)
  18. 【微信开发|PHP】设置关注自动回复,关键词自动回复。
  19. 《2022 数字时代|元宇宙产业发展高峰论坛》圆满落幕
  20. (4)小程序 - 家庭收支系统

热门文章

  1. hp服务器 固件更新网站,hp服务器固件升级
  2. HTML/Javascript game start menu:游戏开始界面(附代码)
  3. 上海证券综合指数统计分析及挖掘(一)
  4. mysql dml语句 先读取在更新_事务的4个特性——ACID(原子性、一致性、隔离性和持久性)、更新丢失问题...
  5. FPGA||ZYNQ概念理解之: Cortex-A9 处理器及架构
  6. 防火墙iptables转发规则
  7. C++类、结构体、函数、变量等命名规则详解
  8. 把手机照片视频传到电脑
  9. 去掉Excel单元格最右边的几个字母
  10. 【解决问题】‘cl‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。