go command在获取源码包时,会根据代码中的import path来导向该通过何种方式下载
参考:https://golang.org/cmd/go/#hdr-Remote_import_paths
- go command内置支持一些常见的站点,比如Bitbucket或GitHub等,会有内置对应的取包方式,比如
import "github.com/user/project"
go command会用Git去获取GitHub源
Bitbucket (Git, Mercurial)
import "bitbucket.org/user/project"
import "bitbucket.org/user/project/sub/directory"
GitHub (Git)
import "github.com/user/project"
import "github.com/user/project/sub/directory"
Launchpad (Bazaar)
import "launchpad.net/project"
import "launchpad.net/project/series"
import "launchpad.net/project/series/sub/directory"
import "launchpad.net/~user/project/branch"
import "launchpad.net/~user/project/branch/sub/directory"
IBM DevOps Services (Git)
import "hub.jazz.net/git/user/project"
import "hub.jazz.net/git/user/project/sub/directory"
- 除了以上这些常见的站点,如果代码存放在自己搭建的version control system,那么配置import路径时有两种方式
-
repository.vcs/path
,在import路径中指明是哪种类型的vcs,告诉go command用哪种方式去获取。- 比如:
import "example.org/repo.git/foo/bar"
表示用git从example.org/repo 获取foo/bar包。 - 支持的vcs有 :
Bazaar .bzr Fossil .fossil Git .git Mercurial .hg Subversion .svn
- 比如:
-
如果import path
import "example.org/pkg/foo"
中没有指明vcs,那么go command会通过一个https/http请求curl https://example.org/pkg/foo?go-get=1
来取得vcs的信息。- 一般的vcs都会实现这个方法,返回格式
<meta name="go-import" content="import-prefix vcs repo-root">
,比如<meta name="go-import" content="example.org git https://code.org/r/p/exproj">
- 其中import-prefix 必须匹配代码中import path的前缀,比如如果代码中
import "otherexample.org/pkg/foo"
这样就不匹配,go command会报错 - 其中vcs支持的有
"bzr", "fossil", "git", "hg", "svn"
- 其中repo-root指的是下载的root地址,比如go command会使用
git clone https://code.org/r/p/exproj
来获取源码包 - 特别注意的是当使用go mod时,
curl https://example.org/pkg/foo?go-get=1
返回的格式支持代理模式,比如请求返回的是<meta name="go-import" content="example.org mod https://code.org/moduleproxy">
,其中vcs填充的是mod,表示这个example.org/pkg/foo
可以从地址为https://code.org/moduleproxy
的go module代理服务中获取。这样就成功的让go command使用代理服务下载源码包
- 一般的vcs都会实现这个方法,返回格式
-
来源:oschina
链接:https://my.oschina.net/u/3211934/blog/3214637