去不工作/从不同的地方去

时间:2016-09-16 10:46:34

标签: go

我尝试go get最初托管在已停用/不可用的A.com服务器上的项目。 现在,B.com下提供了相同的项目,但代码中的所有导入都指向A.com(例如import A.com/user/projet/lib)。

当我尝试go get B.com/user/projet时,它会从B.com克隆git repo,但后来尝试从A.com下载资源。

如何告诉go getA.com/user/projet现在是否在B.com/user/projet提供(不重写代码中的导入)?

2 个答案:

答案 0 :(得分:2)

这很难做到。

正如我之前和@jimb所建议的那样,重写路径会更容易。但是你可以做些什么。

当导入路径不是知道代码托管站点

  

文本是命令go help importpath

的输出

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

元标记的格式为:

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

运行go help importpath获取完整信息。

这一切意味着什么

基本上这意味着您可以使用旧的导入地址导入代码库,但它将从meta tag

提供的存储库中克隆

但是,您需要原始位置来托管具有meta tag的页面。

不理想

但Golang团队已经知道使用它,见下面的例子。

$ curl golang.org/x/tools/cmd/rename
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="go-import" content="golang.org/x/tools git https://go.googlesource.com/tools">
<meta name="go-source" content="golang.org/x/tools https://github.com/golang/tools/ https://github.com/golang/tools/tree/master{/dir} https://github.com/golang/tools/blob/master{/dir}/{file}#L{line}">
<meta http-equiv="refresh" content="0; url=https://godoc.org/golang.org/x/tools/cmd/rename">
</head>
<body>
Nothing to see here; <a href="https://godoc.org/golang.org/x/tools/cmd/rename">move along</a>.
</body>
</html>
  

go-import元标记告诉go get从哪里获取文件以及源代码要浏览的go-source

请参阅下面有关此功能的有用文章。

Golang Canonical Import Paths

其他更有问题的技巧

代理和/或主机文件条目

其他非常肮脏的技巧是代理有问题的服务器(使用类似nginx和主机条目的东西)或者只是使用主机文件将url指向新位置,但每次克隆时都需要拥有该主机条目。

不推荐

供应商使用git子模块获取软件包和技巧

另一个选择是在源存储库中提供软件包,因此go get将永远不会尝试再次导入软件包,它会忽略您gopath上的软件包。

如果您将软件包作为新模块的子模块添加到存储库中,您仍然可以将两个代码库分开,但因为导入的软件包将位于供应商文件夹中go get将永远不会尝试导入任何内容。 / p>

在我看来,如果你不能做go get元标记

,则会有两个小恶魔
  

我建议您查看git sub-tree作为git sub-modules的替代方案。它们非常酷,更容易处理。

我希望这会有所帮助。

答案 1 :(得分:2)

在维护者自己重写导入之前,没有人提到另一个脏技巧 - $ GOPATH / src / A.com /包中的手动git clonegit pull包。 go buildgo install按预期工作。我这次做的时间很快。