如何解决为什么 go 模块 ssh 自定义私有仓库非 github配置仍然请求 https 获取?
我正在使用 Go 模块。
为了使用模块版本,我不能使用本地模块。例如:
replace locakpkg => ../localpkg v0.1.0
以上将失败,因为替换本地路径目前没有版本(转到 1.15)。
因此,为了使模块版本正常工作,我决定使用私有 ssh 存储库。
我确实搜索了如何使私有 ssh 存储库工作两天。
通过关注许多在线文章,我做到了
git config --global url.user@private.com:.insteadOf https://private.com/
go env -w GOPRIVATE=private.com
我发现 go get 总是会执行 https fetch 来检查 ssl 凭证。所以我也正确配置了一个https服务器。
但最后还是报错:
unrecognized import path "private.com/foo": reading https://private.com/foo?go-get=1: 404 Not Found
我在谷歌上搜索了这个错误,发现这个规范 https://golang.org/ref/mod#vcs-find 说我必须让服务器回复 <meta name="go-import" content="root-path vcs repo-url">
以获取 https 获取请求。
-
如果有办法在本地模块包中使用 git tag versioning,我可以在 go.mod 中使用 local replace 而不是配置私有 ssh repo。
-
如果以上几点都不可行,那么在配置私有 ssh 存储库时如何避免 https fetch?我认为 ssh repo 与 https 协议无关。
解决方法
(我在 linux 上使用 go 1.15。发布此答案时的最新稳定版本)
我解决了这个问题并在这里发帖,希望有一天这会帮助其他人。我在网上搜索没有找到任何正确的答案。
简而言之,答案是在所有地方都使用 .git
后缀。如果没有 .git
后缀,go mod tidy
和 go get
将使用 https
而不是 ssh
(git)。
在客户处:
文件 ~/.gitconfig
(在 linux 上)如果您在服务器上使用 /repopath/foo.git
路径:
[url "ssh://user@private.com"]
insteadOf = https://private.com
文件 ~/.gitconfig
(在 linux 上)如果您在服务器上使用 ~/repopath/foo.git
路径:
[url "user@private.com:"]
insteadOf = https://private.com/
在 linux 上执行以下操作以更新 ~/.config/go/env
:
go env -w GOPRIVATE=private.com
在go.mod
中,应该使用
require private.com/repopath/foo.git v0.1.0
在file.go
中,应该是
import private.com/repopath/foo.git
在 SSH 服务器上
在私人服务器的 foo.git/go.mod
中应该有:
module private.com/repopath/foo.git
并确保服务器上的 git repo 具有标记版本 v0.1.0
。不要忘记在客户端使用 git push --tags
将标签版本更新到服务器。如果没有 --tags
,将不会推送标签版本。
在所有需要的地方添加.git
后缀后,go mod tidy
和go get
将不再发送https请求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。