欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang编译之vendor机制

程序员文章站 2022-03-25 17:37:56
Go 1.5引入了vendor 机制,但是需要手动设置环境变量 GO15VENDOREXPERIMENT= 1,Go编译器才能启用。从Go1.6起,,默认开启 vendor 目录查找,vendor 机制就是在包中引入 vendor 目录,将依赖的外部包复制到 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
  • 23行/src/后修改成自己源码的路径。
  • vendor目录可以放在makefile所在目录或src里的任意目录中。

 

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