"go get"如何了解用于远程回购的版本控制系统?

smw*_*dia 3 go

我是golang的新手.我了解到它go get是一个包管理器,并与各种版本控制系统联系远程回购.

那么,给定一个包导入路径,如何go get决定使用哪个VCS?我总是在reqeust中看到下面的查询字符串:

?go-get=1
Run Code Online (Sandbox Code Playgroud)

所以似乎有些协议/惯例?

Mar*_*oij 5

关于Go的一个好处是,一切都在,好吧,Go :-)包括几乎所有的标准库和工具.

cmd/go/vcs.go我们可以看到这是如何完成的,并在cmd/go/alldocs.go其中记录.

具体来说,看看repoRootForImportPath:

// repoRootForImportPath analyzes importPath to determine the
// version control system, and code repository to use.
func repoRootForImportPath(importPath string, security securityMode) (*repoRoot, error) {
Run Code Online (Sandbox Code Playgroud)

这样做是:

  1. vcsPaths拥有"已知主机"的静态列表.对于某些人(例如GitHub),这很容易,我们可以设置VCS.对于其他人(例如BitBucket),使用回调函数来检查URL以查看可以使用哪个回购.

  2. 如果失败,它会尝试查看路径中的"VCS扩展",例如example.com/foo.gitexample.com/foo.git/dir.

  3. 最后go get将寻找一个go-import元标记,看起来像:

    <meta name="go-import" content="example.com/path git https://github.com/Example/repo.git">
    
    Run Code Online (Sandbox Code Playgroud)

    另见parseMetaGoImports().Hugo的Vanity Imports是一个很好的介绍如何使用它.

没有真正的"自动检测"机制.因此,如果你回购生活,https://example.com/stuff那么go get example.com/stuff无法奏效.您需要扩展或元标记.

go-get=1添加该参数,以便网站构建者可以轻松地看到这是一个请求go get,这在某些情况下可能很有用.