10.手撕Go语言-包管理

介绍

Go1.11版本提供Go modules机制对包进行管理,同时保留GOPATH和vendor机制,使用临时环境变量GO111MODULE进行控制,GO111MODULE有三个可选值:

  1. 当GO111MODULE为off时,构建项目始终在GOPATH和vendor目录搜索目标程序依赖包
  2. 当GO111MODULE为on时,构建项目则始终使用Go modules机制,在GOPATH/pkg/mod目录搜索目标程序依赖包
  3. 当GO111MODULE为auto(默认)时,当构建源代码不在GOPATH/src的子目录且包含go.mod文件,则使用Go modules机制,否则使用GOPATH和vendor机制

GOPATH+vendor机制

  1. vendor

    将项目依赖包拷贝到项目下的vendor目录,在编译时使用项目下vendor目录中的包进行编译

    解决问题:

    • 依赖外部包过多,在使用第三方包时需要使用go get进行下载
    • 第三方包在go get下载后不能保证开发和编译时版本的兼容性
  2. 包搜索顺序

    • 在当前包下的vendor目录查找
    • 向上级目录查找,直到GOPATH/src/vendor目录
    • 在GOPATH目录查找
    • 在GOROOT目录查找
  3. 第三方包

    可以借助go get工具下载和安装第三方包及其依赖,需要安装与第三方包匹配的代码管理工具,比如git、svn等

    使用方法:

    10.手撕Go语言-包管理_第1张图片
    10.01.png
常用参数:

+ -d:仅下载依赖包
+ -u:更新包并安装
+ -x:打印执行的命令
+ -v:打印构建的包
+ -insecure:允许使用http协议下载包

第三方包查找地址:

+ [https://godoc.org](https://godoc.org)
+ [https://gowalker.org/](https://gowalker.org/)

Go modules机制

  1. 优势:

    • 不用设置GOPATH,代码可任意放置
    • 自动下载依赖管理
    • 版本控制
    • 不允许使用相对导入
    • replace机制
  2. 初始化模块

    命令:go mod init modname

    10.手撕Go语言-包管理_第2张图片
    10.02.png
  3. 当前模块下的包

    对于当前模块下的包导入时需要使用modname+packagename

    10.手撕Go语言-包管理_第3张图片
    10.03.png
  4. 第三方包

    在使用go mod tidy、go build、go test、go list命令会自动将第三方依赖包写入到go.mod文件中同时下载第三方依赖包到GOPATH/pkg/mod/cache目录,并在当前模块目录生成一个构建状态跟踪文件go.sum,文件中记录当前module所有的顶层和间接依赖,以及这些依赖的校验和

    10.手撕Go语言-包管理_第4张图片
    10.04.png
  5. 常用命令

    • go mod tidy:整理依赖模块(添加新增的,删除未使用的)

    • go mod vendor: 将依赖模块拷贝到模块中的vendor目录

    • go build: 编译当前模块

    • go build ./...: 编译当前目录下的所有模块

    • go build -mod=vendor:使用当前模块下的vendor目录中的包进行编译

    • go mod download: 仅下载第三方模块

    • go mod grapha: 打印所有第三方模块

    • go list -m -json all:显示所有模块信息

    • go mod edit: 修改go.mod文件

      -require=pakcage@version

      -replace=old_package@version=new_package@version

      可以使用-replace功能将包替换为本地包,实现相对导入

欢迎添加公众号【扯淡er】学习交流

10.手撕Go语言-包管理_第5张图片
扯淡er

你可能感兴趣的:(10.手撕Go语言-包管理)