golang編譯之vendor機制


       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 命令就能輕松編譯。

 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
  • 27行/src/后修改成自己源碼的路徑。
  • vendor目錄可以放在makefile所在目錄或src里的任意目錄中。

 

參考文檔:《Go語言核心編程》 李文塔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM