Golang如何引入私有托管模块

Golang如何引入私有托管模块 我是Go语言的新手,接手了一个代码库并尝试运行它。在源代码中,我执行了 go build .,但它报错说缺少 go.sum 条目,并且它很贴心地告诉我该怎么做:go mod download private-host.net/org/harbor-client。现在的问题是,private-host 是一个运行在默认端口 7990 上的 Bitbucket 服务器,而模块名/require 中不允许使用端口号。接下来我尝试下载源代码并将其放在 $GOPATH/src/private-host.net/org/harbor-client 目录下,但这没有用,Go 仍然尝试从私有的 Bitbucket 服务器下载并失败,因为无法包含端口号。我该如何在我的其他源代码中使用这个模块(它是从 swagger.yaml 文件自动生成的)?问题似乎可能是因为在 go.mod 文件中的模块名后面添加了一个标签(?)(private-host.net/org/harbor-client v0.0.0-20220613162241-f7f8a7118946),但我不知道它来自哪里,也不知道如何编辑它以匹配 $GOPATH/src/ 路径中的内容……


更多关于Golang如何引入私有托管模块的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

很抱歉,由于某些原因,我没有收到您之前更新的通知。

我意识到我忘记询问您是否已将 GOPRIVATE 环境变量设置为包含模块导入的 URL。这应该可以抑制对 sum 数据库的查询,从而避免出现 404 错误。(参见 Go 模块参考 - Go 编程语言

更多关于Golang如何引入私有托管模块的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的回复。修改 git 配置对 git 有效,但 Go 似乎并不理会。我尝试了 http(替换为带端口号的 http)和 ssh 版本。

将仓库克隆到 $GOPATH/pkg/mod/private-host.net/org/harbor-client 也没有帮助。任何使用 harbor-client 的尝试都会立即导致 Go 尝试下载并报错“无法识别的导入路径 private-host.net/org/harbor-client?go-get=1:拨号 10.60.122.36:80 连接:连接被拒绝”,这是合理的,因为服务器没有监听 80 端口(也没有监听 443 端口)。

我会看看是否能弄清楚如何设置 Go 代理服务器。

你好 @Rapolas_K

你可以尝试通过在你的 Git 配置中添加一个 url insteadOf 来告诉 Git(Go 在底层使用 Git,除非你使用其他版本控制系统)使用 SSH 而不是 HTTP:

[url "ssh://git@private-host.net:7990/"]
	insteadOf = https://private-host.net/

(说实话,我从未在私有 Git 服务器上尝试过这个选项。)

如果 SSH 回退不起作用,可以尝试将代码预下载到 $GOPATH/pkg/mod/private-host.net/org/harbor-client。(据我所知,go 命令不会在 $GOPATH/src 路径中搜索缓存的模块。)

作为最后的手段,你可以安装一个 Go 代理服务器,但这是最复杂的选项。

那个奇怪的标签是一个自动生成的版本号。当模块没有带标签的版本号时,Go 会添加这个。这不应该导致下载出现任何问题,但你可能需要将正确的版本添加到 go.mod 中(例如 v1.2.3)。

您也可以尝试设置一个简单的HTTP服务器,将导入路径映射到VCS URL,如Go模块参考 > 版本控制系统中所述。

TL;DR:(已缩短并添加了强调)


如果模块路径在路径组件的末尾带有VCS限定符(.bzr.fossil.git.hg.svn之一),go命令将*[使用相应的VCS下载仓库]*。

如果模块路径没有限定符,go命令会向从模块路径派生出的URL发送一个带有?go-get=1查询字符串的HTTP GET请求。 例如,对于模块golang.org/x/modgo命令可能会发送以下请求:

https://golang.org/x/mod?go-get=1 (首选)
http://golang.org/x/mod?go-get=1  (后备,仅在设置了GOINSECURE时使用)

go命令会遵循重定向,但会忽略响应状态码,因此服务器可以响应404或任何其他错误状态。可以设置GOINSECURE环境变量,以允许对特定模块回退和重定向到未加密的HTTP。

服务器必须响应一个HTML文档,该文档的<head>中包含一个<meta>标签。 <meta>标签应出现在文档的早期,以避免混淆go命令的限制性解析器。特别是,它应该出现在任何原始JavaScript或CSS之前。<meta>标签必须采用以下形式:

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

[例如:]

<meta name="go-import" content="golang.org/x/mod git https://go.googlesource.com/mod">

根据此响应,go命令将使用远程URL https://go.googlesource.com/mod上的Git仓库。

[…]

找到仓库URL后,go命令会将仓库克隆到模块缓存中。


在您的情况下,如果您能够在端口80或443上直接在private-host.net托管HTTP服务器,则要返回的meta标签将如下所示:

<meta name="go-import" content="private-host.net/org/harbor-client git https://private-host.net:7990/org/harbor-client">

在Go语言中引入私有托管模块,需要通过配置GOPROXYGOPRIVATE环境变量,并设置Git凭证。以下是具体步骤:

1. 配置环境变量

# 设置私有仓库域名,多个用逗号分隔
export GOPRIVATE=private-host.net

# 可选:设置代理,direct表示直接访问私有仓库
export GOPROXY=https://goproxy.cn,direct

2. 配置Git访问私有仓库

对于需要认证的私有仓库,需要在Git中配置替代URL:

# 方法1:在.gitconfig中配置
git config --global url."ssh://git@private-host.net:7990".insteadOf "https://private-host.net"

# 方法2:或者使用HTTP认证
git config --global url."https://username:password@private-host.net:7990".insteadOf "https://private-host.net"

3. 更新go.mod中的replace指令(如果需要)

如果模块已经存在于本地,可以在go.mod中添加replace指令:

module your-project

go 1.19

require (
    private-host.net/org/harbor-client v0.0.0-20220613162241-f7f8a7118946
)

replace private-host.net/org/harbor-client => ../local/path/to/harbor-client

4. 完整的配置示例

# 在.bashrc或.zshrc中添加
export GOPRIVATE=private-host.net
export GOPROXY=https://goproxy.cn,direct

# 配置Git访问
git config --global url."ssh://git@private-host.net:7990".insteadOf "https://private-host.net"

5. 执行构建

配置完成后,执行以下命令:

# 下载依赖
go mod download

# 整理go.mod
go mod tidy

# 构建项目
go build .

6. 如果使用HTTP认证,创建.netrc文件

对于HTTP基本认证,可以在~/.netrc文件中配置:

machine private-host.net
login your-username
password your-password

7. 验证配置

# 检查Git配置
git config --global --get-regexp url\..*\.insteadof

# 尝试下载模块
GOPROXY=direct go get private-host.net/org/harbor-client@v0.0.0-20220613162241-f7f8a7118946

这些配置确保Go工具链能正确访问私有Bitbucket服务器上的模块。标签v0.0.0-20220613162241-f7f8a7118946是Go模块的伪版本号,由版本控制系统的时间戳和提交哈希生成,不需要手动修改。

回到顶部