GO111MODULE

  1. Go语言提供了GO111MODULE这个环境变量来作为Go modules的开关,其允许设置以下参数:
    • auto:只要项目包含了go.mod文件(在$GOPATH/src外面且根目录有go.mod文件时)的话启用Go modules
    • on:启用Go modules,推荐设置,会忽略GOPATHvendor文件夹,只根据go.mod下载依赖。
    • off:禁用Go modules,不推荐设置,会从GOPATHvendor文件夹寻找包。
  2. GO111MODULE相关解释:
    • GO111MODULE这个命名代表着Go语言在1.11版本添加的,针对Module的变量。
    • 像是在Go1.5版本的时候,也发布了一个系统环境变量GO15VENDOREXPERIMENT
    • 作用是用于开启vendor目录的支持,当时其默认值也不是开启,仅仅作为experimental
    • 其随后在Go1.6版本时也将默认值改为了开启,并且最后作为了officialGO15VENDOREXPERIMENT系统变量就退出了历史舞台。
    • 而未来GO111MODULE这一个系统环境变量也会面临这个问题,不去除是为了兼容老版本。
$ go env -w GO111MODULE=auto

GOPROXY

  1. 这个环境变量主要是用于设置Go模块代理,直接通过镜像站点来快速拉取。
  2. GOPROXY的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是https://proxy.golang.org在国内是无法访问的。
    • 在该配置下,go命令首先去Google运行的Go模块镜像,如果镜像没有模块,则回退到直接连接。
    • 可以设置GOPRIVATEGONOPROXY环境变量以防止使用代理下载特定模块。
  3. 中国大陆推荐使用 go env -w GOPROXY=https://goproxy.cn,direct
    • 其他源地址列表:https://goproxy.cnhttps://goproxy.iohttps://goproxy.baidu.com/
    • GOPROXY的值是一个以英文逗号(,)或竖线(|)分割的Go模块代理列表,允许设置多个模块代理。
    • 假设你不想使用,也可以将其设置为“off” ,这将会禁止Go在后续操作中使用任何Go模块代理。也就是go env -w GOPROXY=off
    • direct 是什么?
      • 是一个特殊指示符,用于指示Go回源到模块版本的源地址去抓取(比如GitHub等)。
      • 当值列表中上一个Go模块代理返回404410错误时,Go自动尝试列表中的下一个。
      • 遇见“direct”时回源,也就是回到源地址去抓取,而遇见EOF时终止并抛出类似“invalid version: unknown revision...”的错误。
  4. 模块代理URL列表,以逗号 (,) 或竖线 (|) 分隔:
    • go命令查找某个模块的信息时,它会依次联系列表中的每个代理,直到收到成功响应或终端错误为止。
    • 代理可能会以404(未找到)或410(已消失)状态响应,以指示该模块在该服务器上不可用。
  5. go命令的错误回退行为由URL之间的分隔符决定:
    • ,go命令会在404410错误后回退到下一个URL,所有其他错误都被视为终端错误。
    • |go命令在出现任何错误(包括超时等非HTTP错误)后回退到下一个源。
  6. GOPROXYURL可能具有httpshttpfile方案,如果URL没有方案,则假定为https
  7. 模块缓存可以直接用作文件代理:go env -w GOPROXY=file://$(go env GOMODCACHE)/cache/download
  8. 可以使用两个关键字代替代理URL
    • off:禁止从任何来源下载模块。
    • direct:直接从版本控制存储库下载,而不是使用模块代理。
$ go env -w GOPROXY=https://goproxy.cn,direct

GOSUMDB

  1. 用于在拉取模块版本时(无论是从源站拉取还是通过Go module proxy拉取)保证拉取到的模块版本数据未经过篡改。若发现不一致,也就是可能存在篡改,将会立即中止。
  2. GOSUMDB的默认值为:sum.golang.org,在国内也是无法访问的,但是GOSUMDB可以被Go模块代理所代理。
    • 因此我们可以通过设置GOPROXY来解决,而先前我们所设置的模块代理goproxy.cn就能支持代理sum.golang.org
    • 所以这一个问题在设置GOPROXY后,你可以不需要过度关心。
  3. 另外若对GOSUMDB的值有自定义需求,其支持如下格式:
    • 格式 1:<SUMDB_NAME>+<PUBLIC_KEY>
    • 格式 2:<SUMDB_NAME>+<PUBLIC_KEY> <SUMDB_URL>
  4. 也可以将其设置为“off”,也就是禁止Go在后续操作中校验模块版本,也就是go env -w GOSUMDB=off
  5. 如果GOSUMDB设置为off或者使用go get设置-insecure标志则不会查询校验和数据库,并接受所有无法识别的模块。
    • 代价是放弃对所有模块进行已验证的可重复下载的安全保证。
    • 绕过特定模块的校验和数据库的更好方法是使用GOPRIVATEGONOSUMDB环境变量。
  6. 相关参考文档:https://goproxy.io/zh/docs/GOSUMDB-env.html

GOPRIVATE

  1. 用于当前项目依赖了私有模块,如你公司的私有git仓库,又或是github中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。
    • 就是依赖了由GOPROXY指定的Go模块代理或由GOSUMDB指定Go checksum database都无法访问到的模块时的场景。
  2. 以英文逗号“,”分割的模块路径前缀,也就是可以设置多个,例如:
    • go env -w GOPRIVATE="git.example.com,github.com/helium/bms"
    • 设置后,前缀为git.xxx.comgithub.com/helium/bms的模块都会被认为是私有模块。
  3. 如果不想每次都重新设置,我们也可以利用通配符,例如:
    • go env -w GOPRIVATE="*.example.com"
    • 这样子设置的话,所有模块路径为example.com的子域名(例如:git.example.com)都将不经过Go module proxyGo checksum database
    • 需要注意的是不包括example.com本身。
  4. 相关参考文档:https://goproxy.io/zh/docs/GOPRIVATE-env.html

GONOPROXY

  1. 用于指定不使用模块代理(如proxy.golang.org)下载模块的模块路径前缀列表。
    • 模块代理是Go 1.13及以上版本推出的功能,用于缓存公共模块,以加快模块下载速度和提高模块下载的可靠性。
  2. 该变量包含一个由逗号分隔的模块路径前缀列表。
  3. 如果你有一个私有模块存储在 git.example.com,并希望Go命令直接从该仓库下载模块而不是通过模块代理,你可以设置GONOPROXY=git.example.com

GONOSUMDB

  1. 用于指定不检查其校验和的模块路径前缀列表。
    • Go modules使用校验和数据库(如sum.golang.org)来确保下载的模块版本没有被篡改。
  2. GONOPROXY类似,该变量也包含一个由逗号分隔的模块路径前缀列表。
  3. 假设你有私有模块并且不希望Go命令尝试验证这些模块的校验和,你可以设置GONOSUMDB=git.example.com

GOVCS

  1. 控制go命令可以用来下载公共和私有模块,(由它们的路径是否与GOPRIVATE中的模式匹配)或其他与glob模式匹配的模块的版本控制工具集。
  2. 如果未设置GOVCS,或者模块与GOVCS中的任何模式都不匹配,则go命令可能对公共模块使用githg,或对私有模块使用任何已知的版本控制工具。
  3. 具体来说,go命令就像GOVCS被设置为(默认模式):public:git|hg,private:all