使用 Go vendor
一、Go vendor 介绍
Go 语言在发布 1.5 版本时,就说可以使用自身提供的 vendor
特性,但是需要设置如下环境变量:
GO15VENDOREXPERIMENT=1
在发布 1.6 版本时,该环境变量的值已经默认设置为 1 了,该值可以使用 go env
命令查看。
根据官方的说法,在发布 1.7 版本时,将去掉该环境变量,默认开启 vendor
特性。
现在也有很多包管理工具,比如 Godep
、govendor
、gvt
等等,并且也都支持语言本身提供的 vendor
特性,那么我的问题是:
不使用第三方包管理工具,如何使用
vendor
特性呢?
一开始 google 了好多文档都没有符合要求的,最后就在 stackover flow 上求问才找到解决方法。
1. 设置环境变量
GOPATH=”/Users/thinkerou/xyz/”
2. 建立测试需要的目录
thinkerou@MacBook-Pro-thinkerou:~/xyz$ pwd /Users/thinkerou/xyz thinkerou@MacBook-Pro-thinkerou:~/xyz$ ls src thinkerou@MacBook-Pro-thinkerou:~/xyz$ cd src thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls ou thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd ou thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls main.go vendor thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd vendor/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls vendor.json
就是需要在 $GOPATH
目录下建立 src/my-program-name
目录,同时需要在目录 src/my-program-name
目录下建立vendor
目录。
注:vendor.json 暂时还没有用处,应该是只有使用第三方包管理工具时才有用。
3. 编写测试文件
测试的 main.go
文件内容为:
package main import ("fmt""net/http""github.com/zenazn/goji""github.com/zenazn/goji/web" ) func hello(c web.C, w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"]) } func main() {goji.Get("/hello/:name", hello)goji.Serve() }
示例程序中使用到了第三方 goji
库。
4. 获取第三方库文件
使用命令 go get
获取依赖的第三方库文件,如下:
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls main.go vendor.j thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ go get thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls main.go vendor.j thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd .. thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls github.com ou thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd github.com/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com$ ls zenazn thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com$ cd zenazn/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com/zenazn$ ls goji thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com/zenazn$ cd goji/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com/zenazn/goji$ ls LICENSE bind example graceful serve_appengine.go README.md default.go goji.go serve.go web
从上可知,在 $GOPATH/src
目录下出现了第三方依赖库的目录 github.com/zenazn/goji/
树。
在获取到第三方库文件后,使用命令 go build
就会生成可执行文件,或使用命令 go run main.go
直接运行程序。
到这里,会发现还是使用老方法来运行程序的,并没有使用到本文要讨论的话题:如何使用 vendor 特性?
5. 使用 vendor 特性
为了使用上新的 vendor
特性,需要做一些操作:
thinkerou@MacBook-Pro-thinkerou:~/xyz$ pwd /Users/thinkerou/xyz thinkerou@MacBook-Pro-thinkerou:~/xyz$ ls bin pkg src thinkerou@MacBook-Pro-thinkerou:~/xyz$ cd src/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls github.com ou thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd ou/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls main.go vendor thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd vendor/ thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls vendor.json thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ mv ../../github.com . thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls github.com vendor.json
从上可知,使用原来的老方法,在 $GOPATH
目录下已经产生了 bin
和 pkg
目录,都是熟知的。
为了支持 vendor
特性,需要将使用 go get
命令获取到的第三方目录 剪切或复制
到 src/my-program-name/vendor/
目录下。
如此,使用命令 go build
或 go run main.go
即可执行程序,并不会去重新下载依赖的第三方库文件,而是直接使用vendor
目录下的文件。
6. 白话 vendor 原理
简单来说,vendor
的原理就是:
在执行
go build
或go run
命令时,会首先去判断vendor
是否存在,以及是否存在依赖的第三方库文件,如果满足则使用之;否则,就走原来的流程去获取第三方库文件到$GOPATH/src/
目录下。
使用 Go vendor相关推荐
- Linux下获取usb视频设备vendor id和product id的8种方法
在使用usb摄像头获取视频时,有时需要获取此摄像头供应商ID(vendor id, vid)和产品ID(product id, pid),这里在Linux下提供获取vid和pid的8种方法: 1. 通 ...
- 话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本
类库扩展包括基类库扩展.应用类库扩展和第三方类库扩展,所有扩展类库不会自动加载,需要手动加载或者定义别名和配置自动加载(详细可以参考4.2.3类库导入和4.2.5自动加载). 1 基类库扩展 目前支持 ...
- php vendor 删除,yii2我删除了vendor目录,然后重新composer install composer update就不行了。。。...
是酱紫的,我把vendor的整个目录都删除了,然后重新执行了 composer install -o --prefer-dist && composer update -o --pre ...
- go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制
简介 Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司. 在互联网发展至今,软件系统不断膨胀. 各个编程语言也都逐步支持了 ...
- SAP QM 激活01检验类型的前提下无Vendor CoA则不允许收货过账
SAP QM 激活01检验类型的前提下无Vendor CoA则不允许收货过账 前几天笔者写了一篇文章是关于不启用QM 检验类型的前提下,实现仓库部门收货环节No Vendor CoA则No GR的方法 ...
- SAP QM 采购订单收货时没有Vendor CoA就不让收货过账的实现
SAP QM 采购订单收货时没有Vendor CoA就不让收货过账的实现 物料号757, 指派了QM Control Key 0005, Certificate Type Z01,没有激活检验类型. ...
- SAP RETAIL MM41 创建的商品主数据里为啥会有Vendor Char.按钮?
SAP RETAIL MM41 创建的商品主数据里为啥会有Vendor Char.按钮? 商品631主数据的采购视图里有按钮Vendor Char.按钮, 商品634主数据采购视图里没有这个按钮, 原 ...
- BP as a Vendor and Customer Configuration
Business Partner Configuration Last time, I had posted a blog on How to create a BP and today i woul ...
- SAP MM Vendor Rebate Process and Settings
SAP MM Vendor Rebate Process and Settings Abstract – This document covers – Overview of SAP Vendor R ...
- SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor?
SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor? 经过验证是可以的.比如如下退货采购订单, 数量是10,勾选了"Return Items"选项, VL10B, ...
最新文章
- LIVE 预告 | CVPR 2021 预讲 · 迁移学习前沿与进展
- 光脚丫学LINQ(029):如何将列表示为类成员
- Sprint第三阶段(第四天12.12)
- UI实用素材|统计界面模板
- gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)
- 对象创建的过程 java_Java 对象创建过程
- 人生小故事,看完后想十秒钟,你会获益匪浅
- 五、Oracle学习笔记:DQL数据查询语句
- java毕业设计——基于java+Spring+SSH的CRM客户关系管理系统设计与实现(毕业论文+程序源码)——CRM客户关系管理系统
- 半导体器件基础与二极管电路
- 上位机plc编程入门_PLC与上位机的通信-plc上位机程序开发
- NAT穿透原理(转载)
- 微信计算机配置高速缓冲器,电脑中设置固态硬盘SSD为高速缓存器的方法
- ORA-01403未找到任何数据select into问题分析
- 图片马赛克去除工具_黑科技!利用 AI 技术,马赛克终于可以去掉了
- 停课不停学的网络教学方案
- php 法定节假日接口,通过百度接口获取每一个月的工作和法定假日
- 80后应该负重致远 [转自空瓶子]
- 知识图谱系统课程笔记(二)——知识抽取与挖掘
- gom引擎Gompj.dll跟Key.lic做什么的
热门文章
- 测试工程师学习的书单(更新中)
- JDK1.8HashMap源码级分析
- 2021-04-20 #CentOS7配置sftp服务器操作日志#
- IIC 通信协议 (一)
- Could not receive a message from the daemon
- VMWare中安装Kali Linux问题
- 那些正在消失的 Flash 网站
- 我是一个教师,是一个会长,是一个RL也是一个普通的WOWER
- JAVA毕业设计web考试资料交易系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
- [Unity3D]Unity3D游戏开发之截屏保存精彩瞬间