GO的依赖管理go module、GOPATH、GOPROXY | 豆包MarsCode AI 刷题

167 阅读4分钟

1. 概述

  • go的依赖管理的演进:GOPATH-->go vendor-->go module
    • GOPATH
      • 特点:依赖的第三方库源码只能放在GOPATH的src下才能正确导入需要的包,go get方式下载的依赖也是直接下载到src目录下。
      • 带来的问题:当两个项目依赖同一个package的不同版本,由于package源码都是在src目录下,且go get时无法指定版本,导入包的时候也不能指定具体的版本。即无法做多版本的管理。
    • go vendor
      • 特点:在项目目录下会存在一个vendor文件夹。用来缓存一份项目的依赖,也就是说项目的包在vendor中有一份,在GOPATH/src中也有一份。项目会先去vendor中找,然后再去vendor中找。
      • 解决的问题:这样就能在vendor中存在一个当前项目需要的某个版本的依赖了,不用再出现和其他项目因为依赖的项目版本不同而在src下会出问题了。解决了多版本依赖的问题。
    • go module
      • go1.11开始引入
      • 可以通过设置环境变量中的GO111MODULE值为on来开启,off来关闭。
      • 特点:在项目目录下会有一个go.mod文件。如果没有可以通过命令生成。
  • goproxy代理
    • 作用:存放依赖包的代理站点。如果设置了goproxy站点,会先从设置的站点上去获取所需要的依赖,当所有的代理站点都获取不到时,才会从源站上下载。
    • 比如获取github上的代码失败,可以设置阿里云的代理,从国内代理站点中下载会更快更稳定。
  • go get/go mod命令工具

2. GOPATH

  • 在GOPATH模式下,go get下载的依赖会放在$GOPATH/src下。我们自己编写的项目代码也是放在$GOPATH/src目录下。
  • GOPATH目录结构:
- bin 存放编译后的二进制文件
- pkg 存放编译后的库文件
- src 存放项目代码

3. go module

  • go1.11之后,项目默认会使用go module来管理项目依赖,即环境变量中的GO111MODULE默认为 on开启状态,改为off则为关闭状态。
    • 查看go环境变量的命令:go env
    • 修改环境变量:go env -w GO111MODULE=on

Pasted image 20241107200202.png

  • 项目目录下会默认有一个go.mod文件和go.sum文件。如果没有可以通过以下命令生成:
go mod init

3.1 go.mod文件格式

  • go依赖的标识方式:[模块path] [版本]
  • // indirect的含义:表示这个依赖是被项目间接依赖的。比如A-->B-->C,A和B是直接依赖,A和C是间接依赖。
  • +incompatible后缀的含义:
    • 在go module模式的规定中,如果模块的主版本>2了,比如v2.x.x了,就得在模块path后面标识vx,比如example/lib5/v3 v3.0.2
    • 但会有些早期的依赖库,还没有使用go module模式进行依赖管理,没有go.mod文件,且主版本号已经>2了,此时模块path后面就没有标识vx。所以就会在版本后面添加+incompatible标识出来。
  • 版本标识的两种形式:
    • vx.x.x:`v[主版本].[功能版本].[bug、漏洞修复版本]
    • vx.0.0-yyyymmddhhmmss-abcdefd12343:基于commit提交标识的伪版本标识 Pasted image 20241107200448.png
  • go.sum文件
    • 作用:保证项目所依赖的模块版本,不会被篡改。

Pasted image 20241107201814.png

3.2 goproxy代理

  • 作用:存放依赖包的代理站点。如果设置了goproxy站点,会先从设置的站点上去获取所需要的依赖,当所有的代理站点都获取不到时,才会从源站上下载。
    • 比如获取github上的代码失败,可以设置阿里云的代理,从国内代理站点中下载会更快更稳定。
  • 常用的一些代理:
    • 阿里云:https://mirrors.aliyun.com/goproxy/
    • 七牛云:https://goproxy.cn,direct
GOPROXY=https://goproxy.cn,direct
  • 通过命令设置goproxy:
go env -w GOPROXY="https://goproxy.cn,direct" 

4. 常用的go get/go mod命令

  • 获取依赖:go get example.org/pkg默认获取最新版本的依赖包
    • go get example.org/pkg@update获取最新版本(默认)
    • go get example.org/pkg@none删除依赖
    • go get example.org/pkg@v1.1.2获取指定版本
    • go get example.org/pkg@23dfdd5获取指定的commit版本
    • go get example.org/pkg@master获取mater分支最新的commit
  • go mod
  • go mod init初始化,创建go.mod文件
  • go mod download下载模块到本地缓存
  • go mod tidy增加需要的依赖,删除没用到的依赖