我尝试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 get
包A.com/user/projet
现在是否在B.com/user/projet
提供(不重写代码中的导入)?
答案 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
。
请参阅下面有关此功能的有用文章。
其他非常肮脏的技巧是代理有问题的服务器(使用类似nginx和主机条目的东西)或者只是使用主机文件将url指向新位置,但每次克隆时都需要拥有该主机条目。
不推荐
另一个选择是在源存储库中提供软件包,因此go get
将永远不会尝试再次导入软件包,它会忽略您gopath
上的软件包。
如果您将软件包作为新模块的子模块添加到存储库中,您仍然可以将两个代码库分开,但因为导入的软件包将位于供应商文件夹中go get
将永远不会尝试导入任何内容。 / p>
在我看来,如果你不能做go get
元标记
我建议您查看
git sub-tree
作为git sub-modules
的替代方案。它们非常酷,更容易处理。
我希望这会有所帮助。
答案 1 :(得分:2)
在维护者自己重写导入之前,没有人提到另一个脏技巧 - $ GOPATH / src / A.com /包中的手动git clone
,git pull
包。 go build
,go install
按预期工作。我这次做的时间很快。