接上篇: Go Module 工程化实践(一):基础概念篇。
2. go get
取包原理篇
不论是否开启Go Module
功能,go get
从版本控制系统VCS
中取包的基础过程是类似的,除了在新的实现中不再循环拉取submodule
子模块以外。
2.1 go get
基础取包流程
假设依赖包github.com/liujianping/foo
不在本地,需要通过go get
获取。发起以下命令:
$: go get github.com/liujianping/foo
命令发出后:
2.1.1 第一步,正则匹配出依赖包的查询路径
go get
可以指定具体包的import
路径或者通过其自行分析代码中的import
得出需要获取包的路径。但是import
路径,并不直接就是该包的查询路径。在go get
的源码实现中,包的查询路径是通过一组正则匹配出来的。也就是说,import
路径是必须匹配这组正则表达式的,如果不匹配的话,代码是肯定无法编译的。笔者就贴一下这组正则表达式中的github正则与私有仓库的正则:
// Github