3

背景

在我的公司,我们使用 Bit Bucket 来托管我们的 git 存储库。到服务器的所有流量都流经一个自定义的非标准端口。从我们的 repos 克隆看起来像git clone ssh://git@stash.company.com:9999/repo/path/name.git.

问题

我想创建托管在此服务器上并由 管理的 Go 模块go mod,但是,流量必须流经端口的事实9999使得这非常困难。这是因为go mod在标准端口上运行,并且似乎没有提供为不同模块定制端口的方法。

我的问题

是否可以使用go mod非标准端口来管理托管在私有 git 服务器上的 Go 模块?

尝试的解决方案

贩卖

这似乎是最接近提供解决方案的方式。首先go mod vendor是想要使用这些 Go 模块的 Go 应用程序,然后是目录git submodule中的 Go 模块。vendor/在需要更新或添加模块的情况下,这可以完美运行。go mod tidy将一直无法下载或更新其他 Go 模块,因为它无法访问自定义 Go 模块的“git URL”。即使-e设置了标志。

编辑.gitconfig

编辑.gitconfig以将不带端口的 URL 替换为带端口的 URL 是一种可行的解决方案,但这是一个非常肮脏的 hack。首先,必须对任何新模块以及每个单独的开发人员进行这些编辑。其次,这可能会在处理这些存储库时阻止其他 git 进程。

4

1 回答 1

4

go工具在后台使用 git,因此您需要在您的环境中配置 git 以使用备用 url。就像是

git config --global url."ssh://git@stash.company.com:9999/".insteadOf "https://stash.company.com"

虽然我记得 bitbucket/stash 有时会出于我不记得的原因提供额外的后缀,但您可能需要执行以下操作:

git config --global url."ssh://git@stash.company.com:9999/".insteadOf "https://stash.company.com/scm/"

附加编辑

下面提到的用户 bcmills,您还可以通过 HTTPS 提供 go-import 元数据,并使用您喜欢的任何虚 URL,只要您控制域解析。这可以通过不同程度的复杂性来完成,从简单的 nginx 规则静态内容生成器专用的虚荣服务,甚至使用雅典运行您自己的模块代理

但是,这仍然不能完全解决构建环境配置的问题,因为您希望用户设置GOPRIVATEGOPROXY两者都设置,具体取决于您的配置。

此外,如果您选择的域可能是全局可解析的,您可能需要考虑注册它以防止它被潜在的恶意第三方注册。

于 2021-06-23T01:49:48.290 回答