Go笔记(5)可复用模块

这篇记录 go 中的可复用模块。
笔记(1)中有在初始阶段安装遇到问题的实验过程,本篇对模块详细解说。

package

  1. 基本复⽤模块单元:以⾸字⺟⼤写来表明可被包外代码访问
  2. 在 main 被执⾏前,所有依赖的 package 的 init ⽅法都会被执⾏;不同包的 init 函数按照包导⼊的依赖关系决定执⾏顺序;每个包可以有多个 init 函数;包的每个源⽂件也可以有多个 init 函数
  3. Go 未解决的依赖问题:同⼀环境下,不同项⽬使⽤同⼀包的不同版本;⽆法管理对包的特定版本的依赖
  4. Go 1.5之后,vendor ⽬录被添加到除了 GOPATH 和 GOROOT 之外的依赖⽬录查找的解决⽅案。
    查找依赖包路径的解决⽅案如下:
    (1)当前包下的 vendor ⽬录
    (2)向上级⽬录查找,直到找到 src 下的 vendor ⽬录
    (3)在 GOPATH 下⾯查找依赖包
    (4)在 GOROOT ⽬录下查找

本地依赖

本地依赖性需要操作环境变量,修改路径后需要重启IDE

1
2
3
vi ~/.bash_profile 
# 修改path目录如下
export GOPATH="/Users/.../go:另一个地址"

Q: 出现问题,atom中GO111MODULE=’off’,path也没有加上我在.bash_profile中添加的另一个路径。当我修改 GO111MODULE 时出现报错“go env -w GO111MODULE=… does not override conflicting OS environment variable”,修改不成功。

  1. GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  2. GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
  3. GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
    当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
    当前文件在包含go.mod文件的目录下面。
    注:
    在使用go modules时,GOPATH是无意义的,不过它还是会把下载的依赖存储在 $GOPATH/pkg/mod 中
    也会把go install 的结果放在 $GOPATH/bin 中。
    当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg
    允许同一个package多个版本并存,且多个项目可以共享缓存的module。

远程依赖

1
2
3
4
# 获取远程依赖
go get
# 强制从⽹络更新远程依赖
go get -u

常⽤的依赖管理⼯具

godep https://github.com/tools/godep
glide https://github.com/Masterminds/glide
dep https://github.com/golang/dep

1
2
3
4
5
brew install glide
# 初始化,生成 glide.yaml 文件,指定 package 版本
glide init
# 安装,生成 vendor 文件夹
glide install

Go笔记(5)可复用模块
https://guoningyan.com/2024/02/26/Go笔记(5)可复用模块/
作者
Ningyan Guo
发布于
2024年2月26日
许可协议