一、Go vendor 介绍

Go 语言在发布 1.5 版本时,就说可以使用自身提供的 vendor 特性,但是需要设置如下环境变量:

GO15VENDOREXPERIMENT=1

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

根据官方的说法,在发布 1.7 版本时,将去掉该环境变量,默认开启 vendor 特性。

现在也有很多包管理工具,比如 Godepgovendorgvt 等等,并且也都支持语言本身提供的 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相关推荐

  1. Linux下获取usb视频设备vendor id和product id的8种方法

    在使用usb摄像头获取视频时,有时需要获取此摄像头供应商ID(vendor id, vid)和产品ID(product id, pid),这里在Linux下提供获取vid和pid的8种方法: 1. 通 ...

  2. 话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本

    类库扩展包括基类库扩展.应用类库扩展和第三方类库扩展,所有扩展类库不会自动加载,需要手动加载或者定义别名和配置自动加载(详细可以参考4.2.3类库导入和4.2.5自动加载). 1 基类库扩展 目前支持 ...

  3. php vendor 删除,yii2我删除了vendor目录,然后重新composer install composer update就不行了。。。...

    是酱紫的,我把vendor的整个目录都删除了,然后重新执行了 composer install -o --prefer-dist && composer update -o --pre ...

  4. go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制

    简介 Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司. 在互联网发展至今,软件系统不断膨胀. 各个编程语言也都逐步支持了 ...

  5. SAP QM 激活01检验类型的前提下无Vendor CoA则不允许收货过账

    SAP QM 激活01检验类型的前提下无Vendor CoA则不允许收货过账 前几天笔者写了一篇文章是关于不启用QM 检验类型的前提下,实现仓库部门收货环节No Vendor CoA则No GR的方法 ...

  6. SAP QM 采购订单收货时没有Vendor CoA就不让收货过账的实现

    SAP QM 采购订单收货时没有Vendor CoA就不让收货过账的实现 物料号757, 指派了QM Control Key 0005, Certificate Type Z01,没有激活检验类型. ...

  7. SAP RETAIL MM41 创建的商品主数据里为啥会有Vendor Char.按钮?

    SAP RETAIL MM41 创建的商品主数据里为啥会有Vendor Char.按钮? 商品631主数据的采购视图里有按钮Vendor Char.按钮, 商品634主数据采购视图里没有这个按钮, 原 ...

  8. 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 ...

  9. SAP MM Vendor Rebate Process and Settings

    SAP MM Vendor Rebate Process and Settings Abstract – This document covers – Overview of SAP Vendor R ...

  10. SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor?

    SAP MM 没有启用QM的前提下可以从QI库存里退货给Vendor? 经过验证是可以的.比如如下退货采购订单, 数量是10,勾选了"Return Items"选项, VL10B, ...

最新文章

  1. LIVE 预告 | CVPR 2021 预讲 · 迁移学习前沿与进展
  2. 光脚丫学LINQ(029):如何将列表示为类成员
  3. Sprint第三阶段(第四天12.12)
  4. UI实用素材|统计界面模板
  5. gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)
  6. 对象创建的过程 java_Java 对象创建过程
  7. 人生小故事,看完后想十秒钟,你会获益匪浅
  8. 五、Oracle学习笔记:DQL数据查询语句
  9. java毕业设计——基于java+Spring+SSH的CRM客户关系管理系统设计与实现(毕业论文+程序源码)——CRM客户关系管理系统
  10. 半导体器件基础与二极管电路
  11. 上位机plc编程入门_PLC与上位机的通信-plc上位机程序开发
  12. NAT穿透原理(转载)
  13. 微信计算机配置高速缓冲器,电脑中设置固态硬盘SSD为高速缓存器的方法
  14. ORA-01403未找到任何数据select into问题分析
  15. 图片马赛克去除工具_黑科技!利用 AI 技术,马赛克终于可以去掉了
  16. 停课不停学的网络教学方案
  17. php 法定节假日接口,通过百度接口获取每一个月的工作和法定假日
  18. 80后应该负重致远 [转自空瓶子]
  19. 知识图谱系统课程笔记(二)——知识抽取与挖掘
  20. gom引擎Gompj.dll跟Key.lic做什么的

热门文章

  1. 测试工程师学习的书单(更新中)
  2. JDK1.8HashMap源码级分析
  3. 2021-04-20 #CentOS7配置sftp服务器操作日志#
  4. IIC 通信协议 (一)
  5. Could not receive a message from the daemon
  6. VMWare中安装Kali Linux问题
  7. 那些正在消失的 Flash 网站
  8. 我是一个教师,是一个会长,是一个RL也是一个普通的WOWER
  9. JAVA毕业设计web考试资料交易系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  10. [Unity3D]Unity3D游戏开发之截屏保存精彩瞬间