Go 1.5引入了vendor 机制,但是需要手动设置环境变量 GO15VENDOREXPERIMENT= 1,Go编译器才能启用。从Go1.6起,,默认开启 vendor 目录查找,vendor 机制就是在包中引入 vendor 目录,将依赖的外部包复制到 vendor 目录下,编译器在查找外部依赖包时,优先在 vendor 目录下查找。整个查找第三方包的流程如下:

  • 如果当前包下有vendor目录,则从其下查找第三方的包,如果没有找到,则继续执行下一步操作。
  • 如果当前包目录下没有vendor目录,则沿当前包目录向上逐级目录查找vendor目录, ,直到找到 $GOPATH/src下的vendor目录,只要找到vendor目录就去其下查找第三方的包,如果没有则继续执行下一步操作。
  • 在GOPATH下面查找依赖包。
  • 在GOROOT目录下面查找依赖包。
优点:

vendor将原来放在$GOPATH/src的第三方包放到当前工程的vendor目录中进行管理。它为工程独立的管理自己所依赖第三方包提供了保证,多个工程独立地管理自己的第三方依赖包,它们之间不会相互影响。 vendor将原来包共享模式转换为每个工程独立维护的模式, vendor的另一个好处是保证了工程目录下代码的完整性,将工程代码复制到其他Go编译环境,不需要再去下载第三方包,直接就能编译,这种隔离和解耦的设计思路是一大进步。

缺点:

但vendor也有缺点,那就是对外部依赖的第三方包的版本管理。

我们通常使用 go get -u更新第三方包。默认的是将工程的默认分支的最新版本拉取到本地,但并不能指定第三方包的版本。而在实际包升级过程中,如果发现新版本有问题,则不能很快回退,这是个问题。好在Go官方为了解决该问题推出了包依赖管理工具dep。与此同时,社区也有很多包管理工具,比较常用的有godep、govendor、glide。

makefile编译:

分享一个Go编译的通用makefile代码,这样我们就可以在任意目录下,只需简单的执行 make 命令就能轻松编译。

 ## watch for trailing spaces!
THIS_MAKEFILE=$(lastword $(MAKEFILE_LIST))
REPOROOT = $(abspath $(dir $(THIS_MAKEFILE))) export GOPATH := $(REPOROOT)
PATH := $(GOPATH)/bin:$(PATH) ifdef GOROOT
#$(error Define GOROOT prior to running make)
PATH := $(GOROOT)/bin:$(PATH)
endif PATH := /usr/local/go/bin/:$(PATH) # BUILDVER is set by OBS (rpm build system)
BUILDVER ?= MANUALMAKEFILE #when runs on build host - actual golang compiler name is 'golang-go', not 'go'.
#GOCMD ?= golang-go
GOCMD = go GOCLEAN := $(GOCMD) clean .PHONY: all
all:
mkdir -p $(REPOROOT)/bin
cd $(REPOROOT)/src/cmd/project; $(GOCMD) install .PHONY: clean
clean:
@rm -rf $(REPOROOT)/bin
@rm -rf $(REPOROOT)/pkg
  • 23行/src/后修改成自己源码的路径。
  • vendor目录可以放在makefile所在目录或src里的任意目录中。

参考文档:《Go语言核心编程》 李文塔

golang编译之vendor机制的更多相关文章

  1. [转]golang的goroutine调度机制

    golang的goroutine调度机制 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一直对goroutine的调度机制很好奇最近在看雨痕的golang源码分析基于go ...

  2. golang编译源代码和交叉编译方法

    目录 golang编译源代码和交叉编译方法 编译源代码 编译go1.4 编译go1.12 交叉编译 golang编译源代码和交叉编译方法 编译源代码 golang编译其实很简单,下载一份最新的源代码后 ...

  3. Golang 编译成 DLL 文件

    golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW. windows 64 位系统应下载 MinGW 的 64 位版本: https://sourceforge.net/pro ...

  4. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  5. (golang)HTTP基本认证机制及使用gocolly登录爬取

    内网有个网页用了HTTP基本认证机制,想用gocolly爬取,不知道怎么登录,只好研究HTTP基本认证机制 参考这里:https://www.jb51.net/article/89070.htm 下面 ...

  6. golang 编译为dll 的方法

    之前一直再找如何将geojson 转为 svg 格式的数据,看到github上大多都是js来转的,只有一篇是golang来做的,想来把它封成dll 给c#.c++ 调用,网上查了很多方法,并没有写的很 ...

  7. mac上golang编译出现clang错误

    错误现象 几周前,突然发现我的go 项目编译开始报一种以前从来没有出现过的错误: # runtime/cgo clang: warning: argument unused during compil ...

  8. GOLANG编译安装

    GO这个编译器搞的比较混乱,GO本身是汇编+C开发出来的,后来因为觉得自己牛逼,然后用GO语言又写了一次编译器,所以中途抛弃了C,不过这种做法好与不好很难说,go真的这么有自信用自己语言写自己的编译器 ...

  9. Golang GC 垃圾回收机制详解

    摘要 在实际使用 go 语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对研究的结果进行一下总结. 什么是垃圾回收? 曾几何时,内存管理是程序员开发应 ...

随机推荐

  1. 2014年最热门的国人开发开源软件TOP100

    2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多 ...

  2. AtCoder Beginner Contest 078 D ABS

    光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...

  3. WPF 之 DataTemplate 实例(摘抄)

     

  4. 深入Java线程管理(三):线程同步

    一. 引入同步: 有一个很经典的案例,即银行取款问题.我们可以先看下银行取款的基本流程: 1)用户输入账户.密码,系统判断用户的账户.密码是否匹配. 2)用户输入取款金额. 3)系统判断账户金额是否大 ...

  5. java List接口中常用类

    Vector:线程安全,但速度慢,已被ArrayList替代. ArrayList:线程不安全,查询速度快. LinkedList:链表结构,增删速度快.取出List集合中元素的方式: get(int ...

  6. 一道非常棘手的 Java 面试题:i++ 是线程安全的吗

    转载自  一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...

  7. jQuery验证码发送时间秒递减(刷新存储cookie)

    <input id="sendEmail" type="button" name="sendEmail" onclick=" ...

  8. Linux 内核PC/104 和 PC/104+

    当前在工业世界中, 2 个总线体系是非常时髦的: PC/104 和 PC/104+. 2 个在 PC-类 的 单板计算机中都是标准的. 2 个标准都是印刷电路板的特殊形式, 包括板互连的电子的/机械的 ...

  9. JS闭包机制实现为DOM元素循环添加事件

    HTML代码: <button type='button' class='btn' id='1'>按钮1</button> <button type='button' c ...

  10. C#面试题整理2(不带答案)

    一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 1.2.简述abstract.sea ...