管理通过非标准端口访问的自定义 Go 模块 销售编辑.gitconfig

问题描述

背景

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

问题

我想创建托管在此服务器上并由 go mod 管理的 Go 模块,但是,流量必须流经端口 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 是一个可行的解决方案,但这是一个非常肮脏的黑客。首先,必须对任何新模块和每个开发人员进行这些编辑。其次,这可能会在处理这些存储库时阻止其他 git 进程。

解决方法

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,前提是您可以控制域解析。这可以通过不同程度的复杂程度来完成,从 a simple nginx rulestatic content generatorsdedicated vanity services,甚至可以使用 Athens

运行您自己的模块代理

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

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