Go 1.5引入了vendor 机制,可是须要手动设置环境变量 GO15VENDOREXPERIMENT= 1,Go编译器才能启用。从Go1.6起,,默认开启 vendor 目录查找,vendor 机制就是在包中引入 vendor 目录,将依赖的外部包复制到 vendor 目录下,编译器在查找外部依赖包时,优先在 vendor 目录下查找。整个查找第三方包的流程以下:golang
vendor将原来放在$GOPATH/src的第三方包放到当前工程的vendor目录中进行管理。它为工程独立的管理本身所依赖第三方包提供了保证,多个工程独立地管理本身的第三方依赖包,它们之间不会相互影响。 vendor将原来包共享模式转换为每一个工程独立维护的模式, vendor的另外一个好处是保证了工程目录下代码的完整性,将工程代码复制到其余Go编译环境,不须要再去下载第三方包,直接就能编译,这种隔离和解耦的设计思路是一大进步。编程
但vendor也有缺点,那就是对外部依赖的第三方包的版本管理。ide
咱们一般使用 go get -u更新第三方包。默认的是将工程的默认分支的最新版本拉取到本地,但并不能指定第三方包的版本。而在实际包升级过程当中,若是发现新版本有问题,则不能很快回退,这是个问题。好在Go官方为了解决该问题推出了包依赖管理工具dep。与此同时,社区也有不少包管理工具,比较经常使用的有godep、govendor、glide。工具
分享一个Go编译的通用makefile代码,这样咱们就能够在任意目录下,只需简单的执行 make 命令就能轻松编译。ui
1 ## watch for trailing spaces! 2 THIS_MAKEFILE=$(lastword $(MAKEFILE_LIST)) 3 REPOROOT = $(abspath $(dir $(THIS_MAKEFILE))) 4 5 export GOPATH := $(REPOROOT) 6 PATH := $(GOPATH)/bin:$(PATH) 7 8 ifdef GOROOT 9 #$(error Define GOROOT prior to running make) 10 PATH := $(GOROOT)/bin:$(PATH) 11 endif 12 13 PATH := /usr/local/go/bin/:$(PATH) 14 15 # BUILDVER is set by OBS (rpm build system) 16 BUILDVER ?= MANUALMAKEFILE 17 18 #when runs on build host - actual golang compiler name is 'golang-go', not 'go'. 19 #GOCMD ?= golang-go 20 GOCMD = go 21 22 GOCLEAN := $(GOCMD) clean 23 24 .PHONY: all 25 all: 26 mkdir -p $(REPOROOT)/bin 27 cd $(REPOROOT)/src/cmd/project; $(GOCMD) install 28 29 .PHONY: clean 30 clean: 31 @rm -rf $(REPOROOT)/bin 32 @rm -rf $(REPOROOT)/pkg
参考文档:《Go语言核心编程》 李文塔spa