Golang中如何使用go get从私有服务器获取模块/包
Golang中如何使用go get从私有服务器获取模块/包 Go 能够识别一些公共服务器,例如 github.com 和 bitbucket.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
能否提供一个适用于您私有仓库的导入语句和 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应该能正常从你的私有服务器获取模块。

