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