当给定一个未知的代码托管域站点时,'go get'如何工作?



让我们举个例子。以下命令将执行:

go get robpike.io/ivy

这将使我了解 $GOPATH/src 下的存储库内容。伟大!

现在,它是如何工作的?

首先,robpike.io/ivy 使用 HTTP 重定向进行回复:

HTTP/1.1 302 Found

<a href="http://godoc.org/robpike.io/ivy">Found</a>

go help importpath的阅读中,我了解到:

如果导入路径不是已知的代码托管站点,并且还缺少 版本控制限定符,Go 工具尝试获取导入 通过 https/http 并在文档的 HTML 中查找标签

但是,使用以下方法在重定向页面的内容中查找元标记:

curl -D --raw https://godoc.org/robpike.io/ivy | grep go-import

不返回任何内容。

进一步阅读:

存储库根是包含 方案,并且不包含 .vcs 限定符。

例如

导入"example.org/pkg/foo"

将导致以下请求:

https://example.org/pkg/foo?go-get=1(首选)

http://example.org/pkg/foo?go-get=1(回退,仅使用 -insecure)

再:

curl -D --raw https://robpike.io/ivy?go-get=1

不返回任何内容。

所以问题是:我怎样才能做与 Rob Pike 先生相同的事情,并通过 go get 命令使用我自己的网站?

您输入的最后一个命令确实返回数据。当我在终端中运行curl -D --raw https://robpike.io/ivy?go-get=1时,我得到以下数据:

<meta name="go-import" content="robpike.io/toy git https://github.com/robpike/toy.git"><meta name="go-import" content="robpike.io/cmd/translate git https://github.com/robpike/translate.git"><meta name="go-import" content="robpike.io/cmd/freq git https://github.com/robpike/freq.git"><meta name="go-import" content="robpike.io/cmd/hira git https://github.com/robpike/hira.git"><meta name="go-import" content="robpike.io/cmd/kana git https://github.com/robpike/kana.git"><meta name="go-import" content="robpike.io/cmd/kata git https://github.com/robpike/kata.git"><meta name="go-import" content="robpike.io/nihongo git https://github.com/robpike/nihongo.git"><meta name="go-import" content="robpike.io/cmd/typo git https://github.com/robpike/typo.git"><meta name="go-import" content="robpike.io/filter git https://github.com/robpike/filter.git"><meta name="go-import" content="robpike.io/cmd/unicode git https://github.com/robpike/unicode.git"><meta name="go-import" content="robpike.io/cmd/doc git https://github.com/robpike/doc.git"><meta name="go-import" content="robpike.io/cmd/scrub git https://github.com/robpike/scrub.git"><meta name="go-import" content="robpike.io/cmd/strings git https://github.com/robpike/strings.git"><meta name="go-import" content="robpike.io/ivy git https://github.com/robpike/ivy.git"><meta name="go-import" content="robpike.io/cmd/now git https://github.com/robpike/now.git">

这允许 go get 命令解析到 git 存储库的虚路径。

命令curl -D --raw 'https://robpike.io/ivy?go-get=1'返回包含标记的 HTML 文档

<meta name="go-import" content="robpike.io/ivy git https://github.com/robpike/ivy.git">

go get 命令使用此元标记将虚导入路径解析为实际的 git 存储库。你也可以这样做。

最新更新