go 私有模块管理


go get 工具目前通过两种方式下载模块, VCS (版本控制工具)GOPROXY 协议。在 go 1.13 的时候 go 加入了 模块校验机制来确保模块安全性。在 GOPATH 模式可以直接把私有模块代码放到 $GOPATH/src 目录下,go mod 模式就不能这样操作,还是需要老老实实的通过 go get 安装。

GOPROXY

GOPROXY 协议是在 go 1.11 的时候跟 go module 一起支持的。GOPROXY 是基于简单的 HTTP GET 请求定义,使用标准的 HTTP 状态码,具体见 GO 官方的 「GOPROXY 协议 」。GOPROXY 的作用是通过 HTTP 请求在代理服务器上下载模块。在 go 1.13 的时候 GOPROXY 默认为:

GOPROXY="https://proxy.golang.org,direct"

其意义为 go 下载模块时首先去 proxy.golang.org 上下载,当 proxy.golang.org 上找不到该模块(返回 404 或 410 错误码)则通过 direct 方式直接到模块对应的代码仓库下载代码(上述配置中的,分隔可以修改为|分隔拥,| 分隔时无论代理服务器发生了什么错误都尝试到后续的备选方案获取模块)。golang.org 域名在国内一般是不能访问的,使用默认配置会导致因不能访问 proxy.golang.org 而无法下载模块,需要更换一个国内的代理服务器(例如goproxy.cn)。

公共 GOPROXY 能加快下载模块的速度但是不能解决私有化模块的拉取问题,因为这些公共 GOPROXY 服务器肯定是没有访问私有模块代码权限的。当然自己搭建一个私有化的 GOPROXY 服务器并授予访问权限可以解决,但是自己实现的成本比较高不推荐使用。可以使用GONOPROXY 环境变量来设置不需要通过代理下载的模块。

VCS

前面介绍了 GOPROXY 协议,再来看看传统的 VCS 方式下载代码。go 支持 gitsvnhgbzrfossil 五种 VCS。 VCS 方式下载代码是 go 最原始的方式,以 git 为例,go 会调用 git 将整个 mod 的代码仓库 clone 下来。要通过 VCS 方式下载模块首先需要知道模块使用哪种 VCS,模块的源代码仓库地址是什么。go get 有两种方式来判断,第一种是通过模块的名字来判断。

  1. 根据模块名中的域名来判断

    • github.com => git
    • bitbuket.org => git/hg
    • hub.jazz.net/git => git
    • git.apache.org => git
    • git.openstack.org => git
    • chiselapp.com => fossil
  2. 根据模块中的后缀显示指定 VCS, 这种方式通过正则表达式实现

    (?P<root>(?P<repo>([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\-]+)+?)\.(?P<vcs>bzr|fossil|git|hg|svn))(/~?[A-Za-z0-9_.\-]+)*$
    

当前面的条件都不满足时需要通过 HTTP 请求动态获取 VCS 和仓库地址信息。go get 会在模块上加 go-get=1的参数作为 URI 发送一个 HTTP 请求:

golang.org/x/net => https://golang.org/x/net?go-get=1

go get 期待这个 HTTP 请求返回体中包含有效的 mate 标记。有效的 meta 标记中必须有 name=“go-import” 的属性,其具体格式如下:

<meta name="go-import" content="root-path vcs repo-url">

其中 root-pa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值