Go 包依赖管理工具 ?? govendor

发布时间:2021-09-18 14:08:36


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



vendor 特性

最开始的时候,Go 并没有提供较为妥当的包管理工具。从 1.5 版本开始提供了 vendor 特性,但需要手动设置环境变量 GO15VENDOREXPERIMENT=1


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


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

在发布 1.6 版本时,该环境变量的值已经默认设置为 1 了,该值可以使用 go env 命令查看。


在发布 1.7 版本时,已去掉该环境变量,默认开启 vendor 特性。


vendor 使用建议

一个库工程(不包含 mainpackage)不应该在自己的版本控制中存储外部的包在 vendor 目录中,除非有特殊原因并且知道为什么要这么做。

在一个应用中,(包含 mainpackage),建议只有一个 vendor 目录,且在代码库一级目录。


govendor 简介

govendor 是一个基于 vendor 目录机制的包管理工具。


支持从项目源码中分析出依赖的包,并从 $GOPATH 复制到项目的 vendor 目录下支持包的指定版本,并用 vendor/vendor.json 进行包和版本管理,这点与 PHP 的 Composer 类似支持用 govendor add/update 命令从 $GOPATH 中复制依赖包如果忽略了 vendor/*/ 文件,可用 govendor sync 恢复依赖包可直接用 govendor fetch 添加或更新依赖包可用 govendor migrate 从其他 vendor 包管理工具中一键迁移到 govendor支持 Linux,macOS,Windows,甚至现有所有操作系统支持 Git、Hg、SVN,BZR(必须指定一个路径)
govendor 使用

要求:


项目必须在 $GOPATH/src 目录下如果 Go 版本为 1.5,则必须手动设置环境变量 set GO15VENDOREXPERIMENT=1
安装

go get -u github.com/kardianos/govendor

为了方便快捷使用 govendor,建议将 $GOPATH/bin 添加到 PATH 中。Linux/macOS 如下设置:


export PATH="$GOPATH/bin:$PATH"
初始化

在项目根目录下执行以下命令进行 vendor 初始化:


govendor init

项目根目录下即会自动生成 vendor 目录和 vendor.json 文件。此时 vendor.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/sse
e github.com/gin-gonic/gin
e github.com/gin-gonic/gin/binding
e github.com/gin-gonic/gin/internal/json
e github.com/gin-gonic/gin/render
e github.com/golang/protobuf/proto
e github.com/mattn/go-isatty
e github.com/ugorji/go/codec
e gopkg.in/go-playground/validator.v8
e gopkg.in/yaml.v2
pl govendor-example
m github.com/json-iterator/go
m 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

从远程仓库添加或更新某个包(不会$GOPATH 也存一份)

govendor fetch golang.org/x/net/context
安装指定版本的包

govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55
govendor fetch golang.org/x/net/context@v1 # Get latest v1.*.* tag or branch.
govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named "v1".

只格式化项目自身代码(vendor 目录下的不变动)

govendor fmt +local
只构建编译项目内部的包

govendor install +local
只测试项目内部的测试案例

govendor test +local
构建所有 vendor

govendor install +vendor,^program
拉取所有依赖的包到 vendor 目录(包括 $GOPATH 存在或不存在的包)

govendor fetch +out
包已在 vendor 目录,但想从 $GOPATH 更新

govendor update +vendor
已修改了 $GOPATH 里的某个包,现在想将已修改且未提交的包更新到 vendor

govendor update -uncommitted
Fork 了某个包,但尚未合并,该如何引用到最新的代码包

govendor fetch github.com/normal/pkg::github.com/myfork/pkg

此时将从 myfork 拉取代码,而不是 normal


vendor.json 中记录了依赖包信息,该如何拉取更新

govendor sync
govendor 子命令

各子命令详细用法可通过 govendor COMMAND -h 或阅读 github.com/kardianos/govendor/context 查看源码包如何实现的。


子命令功能
init创建 vendor 目录和 vendor.json 文件
list列出&过滤依赖包及其状态
add$GOPATH 复制包到项目 vendor 目录
update$GOPATH 更新依赖包到项目 vendor 目录
removevendor 目录移除依赖的包
status列出所有缺失、过期和修改过的包
fetch从远程仓库添加或更新包到项目 vendor 目录(不会存储到 $GOPATH)
sync根据 vendor.json 拉取相匹配的包到 vendor 目录
migrate从其他基于 vendor 实现的包管理工具中一键迁移
getgo get 类似,将包下载到 $GOPATH,再将依赖包复制到 vendor 目录
license列出所有依赖包的 LICENSE
shell可一次性运行多个 govendor 命令

govendor 状态参数
状态缩写含义
+locall本地包,即项目内部编写的包
+externale外部包,即在 GOPATH 中、却不在项目 vendor 目录
+vendorv已在 vendor 目录下的包
+stds标准库里的包
+excludedx明确被排除的外部包
+unusedu未使用的包,即在 vendor 目录下,但项目中并未引用到
+missingm被引用了但却找不到的包
+programp主程序包,即可被编译为执行文件的包
+outside相当于状态为 +external +missing
+all所有包

支持状态参数的子命令有:listaddupdateremovefetch


Go modules

普大喜奔的是,从 Go 1.11 版本开始,官方已内置了更为强大的 Go modules 来一统多年来 Go 包依赖管理混乱的局面(Go 官方之前推出的 dep 工具也几乎胎死腹中),并且将在 1.13 版本中正式默认开启。


目前已受到社区的看好和强烈推荐,建议新项目采用 Go modules。


参考
govendor 项目golang使用vendor目录来管理依赖包Golang包管理工具之govendor的使用


感谢您的阅读,觉得内容不错,点个赞吧 ?
原文地址: https://shockerli.net/post/go-package-manage-tool-govendor/




转载于:https://www.cnblogs.com/shockerli/p/go-package-manage-tool-govendor.html

相关文档

  • 微信显示内存不足怎么办
  • 关于高职Web技术开发类教材编写建议论文
  • 有关自我保护的作文500字
  • 找到神奇恐龙一共分几步恐龙足迹是怎么形成的
  • 三星s8 怎么只有一个卡
  • 网课综合症什么意思网课综合症怎么缓解
  • redis 远程主机强迫关闭了一个现有的连接_Linux下 Redis集群搭建详解(主从+哨兵)
  • 孤独小花猫童话故事
  • 杨幂爱的供养弹奏演唱简谱
  • 小学一年级下册数学教学计划范文
  • k20pro能用30w充电器吗
  • 伤心的句子大全
  • 员工教师培训的心得体会范文
  • 装修合同的模板
  • 做沙包
  • 说声,真的爱你
  • 开学典礼主持词汇编
  • 麻辣花生广告词
  • 告别过去迎接未来作文600字
  • 如何利用绘本进行数学教学
  • 初中值周教师讲话稿
  • 鸡丝凉面的做法 鸡丝凉面怎么做
  • 用visual studio来编写Unity3D脚本
  • 在校班主任上学期工作总结2020年多篇多篇
  • 三相异步电动机正反转电路中的交流接触器有什么作用
  • 牙齿发黄原因牙齿发黄如何护理
  • 三年级父亲节作文200字
  • 高尔夫左曲球和右曲球技巧
  • 黑板报简笔画素材图片
  • 周末下雨的心情说说
  • 猜你喜欢

  • 【精品文档】基督教圣诞节会议闭幕词-推荐word版 (2页)
  • 网络化农村合作银行风险控制机制研究——一种基于经营陷阱的路径选择
  • 2018-我家的白雪公主优秀作文-word范文 (2页)
  • 北京智诚鼎业网络技术有限公司上海分公司企业信用报告-天眼查
  • 人教版小学三年级语文学年上学期期末检测试题 (3)复习资料
  • 贵州省册亨县第二中学七年级生物上册 1.2.1 生物与环境的关系教学案(无答案)(新版)新人教版
  • SQL Server2012安装教程
  • 深圳市永安和贸易有限公司企业信息报告-天眼查
  • 挤塑板购销合同模板
  • 肝肾功能检查-常用的实验检测
  • 江苏省扬州中学2018-2019学年高二政治上学期10月月考试题
  • 【企业咨询】v客户咨询处理流程
  • 北京爵士国际文化发展有限公司(企业信用报告)- 天眼查
  • 2019《一次成功的实验》课文精品教育.doc
  • 一工区施工进度周报表
  • 2010年江苏高考数学试题
  • 沈阳航空航天大学各学院专业设置及联系方式
  • 2013年山东省冠县武训高级中学高一语文课件《留取丹心照汗青》(粤教版必修1)
  • 碗莲种子市场前景预测及投资规划分析报告(目录)
  • 人教版高一历史必修一: 第7课 英国君主立宪制的建立 课件(共24张PPT)
  • 如何叠船形元宝
  • 对新型干法水泥生产工艺的探讨
  • 空调压缩机声音大怎么解决
  • 欧美风员工培训PPT模板
  • 怀孕吃什么宝宝睫毛长得黑又长
  • D-Link 老款路由器被曝多个高危漏洞,未完全修复
  • 培训交强险条款费率讲稿45页PPT
  • 高中物理第十四章电磁波14.3电磁波的发射和接收课件新人教版选修3_4
  • 浅谈护患沟通的几点技巧
  • 华为自带录屏小白点
  • 小学二年级叙事作文:长大的感觉作文250字
  • 用xshell连接VMware中的Linux
  • 乌鸦与麻雀的童话故事
  • 部编版2019年秋三年级语文上册:口语交际:名字里的故事 创新教案
  • 理科数学2010-2019高考真题分类训练专题二 函数概念与基本初等函数 第五讲函数与方程
  • 《信陵君窃符救赵》教案设计_4
  • 姐的语录
  • 2020版高考英语新增分大一轮复*语法专题全辑专题一动词的时态和语态讲义牛津译林版
  • 思想汇报2018年6月预备党员:党的行为规则
  • 废五金处理方法及国外分布区域
  • 吉林省民安物业管理服务有限公司企业信息报告-天眼查
  • 乡村科技入户社会调查报告
  • 电脑版