Golang中如何使用go get从私有服务器获取模块/包

Golang中如何使用go get从私有服务器获取模块/包 Go 能够识别一些公共服务器,例如 github.combitbucket.org。我正在尝试将 go get 用于一个私有服务器。我可以用 git 克隆我的仓库:

git clone user@10.xxx.yyy.zzz:/srv/git/mymodule.git

我已经让 “go get” 通过以下命令工作:

go get 10.204.101.186/srv/git/mymodule.git/controller.service

但该命令随后失败,并显示:

package 10.204.101.186/srv/git/mymodule.git/controller.service: no Go files in /home/dean/src/golang/go3p/src/10.204.101.186/srv/git/mymodule.git/controller.service

“go get” 所做的是从服务器下载整个路径,包括 .git/ 目录。 这也使得在私有服务器上保留 git 模块变得不可能。

我还没有找到任何关于使用私有服务器的文档。“go get” 命令似乎只识别某些公共服务器。

有没有人知道如何使用 Go 工具链来处理存储在私有服务器上的包或模块?


更多关于Golang中如何使用go get从私有服务器获取模块/包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

能否提供一个适用于您私有仓库的导入语句和 go get 命令的示例?

我的 .go 文件位于 src/ 目录下,路径是 10.204.101.186/srv/git/mymodule.git/controller.service,这是通常的做法。go get 命令会拉取我 GOPATH 中第一个条目下的整个目录结构(包括 srv/git/mymodule.git,而不仅仅是 mymodule/)。

我拥有访问该服务器的 RSA 密钥权限。

更多关于Golang中如何使用go get从私有服务器获取模块/包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在我工作的地方,我们成功使用了一个自托管的 GitLab 实例,其中包含公共和私有仓库。

不过,go get 只会使用 HTTPS 传输进行克隆。你需要为 Git 添加“重写”规则以启用 SSH 传输。

以下代码片段会将访问 example.com 的 HTTPS 请求重写为 SSH 访问:

[url "git@example.com:"]
        insteadOf = http://example.com/

当然,这假设你已经在 SSH 中正确设置了密钥 😊

我希望这能解答你的问题,因为我不太清楚你描述的其他问题……

PS:你的 10.204.101.186/srv/git/mymodule.git/controller.service 包中确实有 .go 文件吗?

PPS:我可能不会在包名中暴露仓库的完整路径,而是使用较短的路径来暴露它。

10.204.101.186 是服务器的 IP 地址。我必须使用服务器的 IP 地址,因为如果我使用服务器名称(在 /etc/hosts 中),go get 会认为服务器名称是包名或路径的一部分。

/srv/git/ 是我的 git 仓库(mymodule.git)所在的目录。controller.service/ 是一个目录,其下我有 src/ 目录,而在 src/ 目录下,我有 cmd/internal/ 目录,.go 文件就存放在这些目录中。internal/controller-service/ 目录下的包名是 “controller”。

我编写的几乎每个 git 项目都有一个 src/ 目录,其下是包含 .go 文件的其他目录。这些子目录之一中的所有 .go 文件都属于同一个包。Go 包一直以来都是这样工作的。

dwschulze:

go get 认为服务器名称是包名或路径的一部分

服务器名称就是包名的一部分!Go 语言中的包就是这样工作的。

dwschulze:

其中一个子目录中的所有 .go 文件都属于同一个包。Go 包一直以来都是这样工作的。

是的,这是事实,我对此没有异议。

dwschulze:

我编写的几乎每个 git 项目都有一个 src/ 目录,其下是包含 .go 文件的其他目录。

所以它不包含类似 GOPATH 的结构,这没问题。

不过,需要 go get 的包是包含你的 Go 文件的那个。你不能 go get 空的包。


正如我之前所说,在我的公司,只要配置了我之前提到的那些 git 设置,使用私有仓库就没有问题。

在我们的代码中,它看起来像这样:

import "example.com/group/project/package"

它运行得非常完美。

10.204.101.186/srv/git/mymodule.git/controller.service 就是你的包名。你必须使用这个名字来 import,例如:

import "10.204.101.186/srv/git/mymodule.git/controller.service"

在传统的 GOPATH 风格环境中,这当然会在你的系统上创建 $GOPATH/src/10.204.101.186/srv/git/mymodule.git/controller.service 这个文件夹。

这就是 Go 传统包系统的工作方式。

如果你希望有所不同,你需要重新配置你的 Git 服务器,使其从一个不同的根目录提供服务。

你可能希望将其配置为 10.204.101.186/mymodule.git/controller.service 指向你的服务。

另外,我不太明白你说的“我在 src/ 目录下有像平常一样的 .go 文件,路径是 10.204.101.186/srv/git/mymodule.git/controller.service”是什么意思。你是想说这个路径指向一个类似 GOPATH 的目录结构吗?Go 包不是这样工作的。看看 GitHub、Bitbucket、GitLab 等平台上的任意 Go 项目,它们都没有 src 文件夹。

对于从私有服务器获取Go模块,可以通过配置GOPRIVATE环境变量和设置Git认证来解决。以下是具体步骤:

1. 配置GOPRIVATE环境变量

# 设置私有仓库的域名/IP
export GOPRIVATE=10.204.101.186

# 或者添加到bashrc/zshrc中永久生效
echo 'export GOPRIVATE=10.204.101.186' >> ~/.bashrc
source ~/.bashrc

2. 配置Git使用SSH协议

~/.gitconfig中添加:

[url "ssh://git@10.204.101.186/"]
    insteadOf = https://10.204.101.186/

3. 配置go get使用正确的导入路径

私有仓库的导入路径应该匹配实际的仓库结构。根据你的git clone命令,正确的导入路径应该是:

go get 10.204.101.186:/srv/git/mymodule.git/controller.service

或者如果仓库有子模块:

go get 10.204.101.186/srv/git/mymodule/controller.service

4. 完整的Go模块配置示例

# 初始化模块
go mod init example.com/myproject

# 设置私有仓库
export GOPRIVATE=10.204.101.186

# 添加依赖
go get 10.204.101.186/srv/git/mymodule@v1.0.0

5. 如果使用Go 1.13+,配置go.mod的replace指令

go.mod文件中:

module myproject

go 1.20

require (
    10.204.101.186/srv/git/mymodule v0.0.0
)

replace 10.204.101.186/srv/git/mymodule => ./local/path/to/mymodule

6. 配置SSH密钥认证

确保SSH密钥已添加到私有服务器:

# 生成SSH密钥(如果没有)
ssh-keygen -t rsa -b 4096

# 将公钥添加到私有服务器的authorized_keys
cat ~/.ssh/id_rsa.pub | ssh user@10.204.101.186 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

7. 验证配置

# 测试git访问
git ls-remote ssh://git@10.204.101.186/srv/git/mymodule.git

# 清理并重新获取
go clean -modcache
go get -v 10.204.101.186/srv/git/mymodule/controller.service

8. 如果使用企业级私有仓库,配置.netrc文件

~/.netrc中添加:

machine 10.204.101.186
login git
password your_access_token

关键点:

  • GOPRIVATE环境变量告诉go命令跳过代理和校验
  • SSH配置确保git操作能正常认证
  • 导入路径需要与实际的git仓库URL匹配
  • 确保私有仓库有正确的go.mod文件

这样配置后,go get应该能正常从你的私有服务器获取模块。

回到顶部