Golang离线获取包的方法

Golang离线获取包的方法 我的虚拟机目前没有网络连接,而我的开发环境设置在那里。但我可以下载包并将其传输到虚拟机。应该将包放在哪个文件夹中?正确的操作步骤是什么?

PS:在网上搜索后,我发现“/home/ubuntu/go/pkg/mod”目录下包含所有包。但我不知道确保包可用且不产生错误的具体步骤。

2 回复

一种选择是使用供应商化

使用模块时,go 命令通常通过从源下载模块到模块缓存中来满足依赖关系,然后从这些下载的副本中加载包。供应商化可用于与旧版本的 Go 进行互操作,或确保用于构建的所有文件都存储在单个文件树中。

go mod vendor 命令在主模块的根目录中构建一个名为 vendor 的目录,其中包含构建和测试主模块中的包所需的所有包的副本。仅由主模块之外的包的测试导入的包不包括在内。与 go mod tidy 和其他模块命令一样,在构建 vendor 目录时,除了 ignore 之外的构建约束不会被考虑。

更多关于Golang离线获取包的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于离线环境下的Go包管理,正确的做法是使用vendor目录或模块代理缓存。以下是具体步骤:

1. 在可联网机器上准备依赖包

# 在可联网机器上,进入项目目录
cd /your/project

# 初始化go.mod(如果还没有)
go mod init your-module-name

# 下载所有依赖到vendor目录
go mod vendor

# 或者使用代理缓存(推荐)
go mod download

2. 传输文件到离线虚拟机

将以下内容从联网机器复制到离线虚拟机:

  • 整个项目目录(包含vendor/文件夹)
  • 或Go模块缓存(默认在$GOPATH/pkg/mod

3. 在离线虚拟机中配置

# 方法一:使用vendor目录(确保项目中有vendor/)
# 设置GOFLAGS环境变量
export GOFLAGS="-mod=vendor"

# 或者每次构建时指定
go build -mod=vendor ./...

# 方法二:使用本地模块缓存
# 将下载的模块缓存复制到虚拟机的Go模块缓存目录
# 默认位置:$HOME/go/pkg/mod 或 $GOPATH/pkg/mod

# 设置GOPROXY为direct,禁用网络
export GOPROXY=direct
export GOSUMDB=off

4. 验证配置

# 检查依赖是否可用
go list -m all

# 构建项目测试
go build ./...

# 运行测试
go test ./...

5. 完整示例脚本

#!/bin/bash
# 在离线虚拟机中执行

# 禁用网络访问
export GOPROXY=direct
export GOSUMDB=off

# 使用vendor模式
export GOFLAGS="-mod=vendor"

# 清理并重新构建
go clean -modcache
go mod tidy
go build -v ./...

重要说明:

  1. 不要直接操作/home/ubuntu/go/pkg/mod目录,应该通过go mod命令管理
  2. 确保离线虚拟机的Go版本与联网机器一致
  3. 使用vendor/目录是最可靠的离线方案
  4. 如果必须手动复制缓存,确保目录结构完整:
~/go/pkg/mod/
├── cache/
├── github.com/
│   └── user/
│       └── repo@v1.2.3/
└── sumdb/

通过以上步骤,可以在完全离线的环境中正常使用Go模块依赖。

回到顶部