go包 三种管理方式

go modulego pathgo vendor三种包管理方式

  • 在golang 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果 package 没有做到完全的向前兼容,往往会导致一些问题。
  • golang 1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。go build 的时候会先去 vendor 目录查找依赖,如果没有找到会再去 GOPATH 目录下查找。
  • golang 1.9 版本推出了实验性质的包管理工具 dep。
  • golang 1.11 版本推出 modules 机制,简称 mod。

 

1. go path包管理方式

GOPATH方式是GO原生支持的方式,一般要求项目下包含三个目录:

bin:放置可执行文件

pkg:放置编译生成的lib包

src:放置源码,go编译查找源文件目录

一般源文件的包名就是所在的文件夹名,如果在main函数中要调用algorithms中的qsort中的函数,只需要import文件即可,路径为GOPATH/src

注:如果需要导入github上的开源代码,直接import项目的url链接即可,并且需要go get导入到本地路径,go会自动在src目录下生成github.com目录。

 

2. go module包管理方式(推荐使用)

Go Module方式是golang1.11新增的特性,直接基于模块管理,而不是基于固定目录,要使用Go Module,需要先设置go变量GO111MODULE=on

go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等

 

GO111MODULE:

GO111MODULE=off: 不使用 modules 功能,查找vendor和GOPATH目录。
GO111MODULE=on: 使用 modules 功能,不会去 GOPATH 下面查找依赖包。
GO111MODULE=auto: Golang 自己检测是不是使用 modules 功能,如果当前目录不在$GOPATH 并且
当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode。

在项目中不需要src目录,使用go mod init建立mod管理,会自动在项目下生成go.mod文件,如果需要依赖第三方代码,除了在项目中import之外,还需要使用go mod download下载包

go.mod文件示例:

go mod init:初始化modules
go mod tidy:检测该文件夹目录下所有引入的依赖,写入 go.mod 文件。删除错误或者不使用的modules,下载没download的package
go mod download:下载modules到本地cache。此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖
go mod vendor:生成vendor目录。会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下

下载后,包的存放位置

 

3. go vendor包管理方式

vendor的原理很简单: 将第三方依赖放入当前项目vendor目录中, 编译的时候从vendor目录中查找依赖而不从GOPATH/src中对应目录中查找。

新增的第三方包直接被get到根目录的vendor文件夹下,不会与其它的项目混用第三方包,完美避免多个项目同用同一个第三方包的不同版本问题。

因此只需要对vendor/vendor.json进行版本控制,即可对第三包依赖关系进行控制。

 

#进入到项目目录
cd /home/gopath/src/mytool

#初始化vendor目录
govendor init

#查看vendor目录
[root@CC54425A mytool]# ls
commands main.go vendor mytool_test.sh

#将GOPATH中本工程使用到的依赖包自动移动到vendor目录中
#说明:如果本地GOPATH没有依赖包,先go get相应的依赖包
govendor add +external
或使用缩写: govendor add +e

#Go 1.6以上版本默认开启 GO15VENDOREXPERIMENT 环境变量,可忽略该步骤。
#通过设置环境变量 GO15VENDOREXPERIMENT=1 使用vendor文件夹构建文件。
#可以选择 export GO15VENDOREXPERIMENT=1 或 GO15VENDOREXPERIMENT=1 go build 执行编译
export GO15VENDOREXPERIMENT=1

govendor只是用来管理项目的依赖包,如果GOPATH中本身没有项目的依赖包,则需要通过go get先下载到GOPATH中,再通过govendor add +external拷贝到vendor目录中。Go 1.6以上版本默认开启GO15VENDOREXPERIMENT环境变量。

posted @ 2022-07-27 23:44  wangssd  阅读(1623)  评论(0编辑  收藏  举报