Golang模块文件夹内安装库的方法

Golang模块文件夹内安装库的方法 大家好。我正在学习Go语言,有一个问题想请教:

我了解到自Go 1.11版本起,由于模块(modules)的引入,GOPATH的使用已被弃用。但每当我使用 go getgo install 命令下载库时,它们仍然会被放置到GOPATH/pkg目录中。

这是默认/正确的行为吗?我能强制它将库存储在我调用 go get/install 命令的模块内部吗?或者这是一个不好的做法?

3 回复

GOPATH 作为托管项目的“工作区”机制已被弃用。

不过,它仍然用于安装二进制文件(bin)或准备链接外部库的构件(pkg)。

更多关于Golang模块文件夹内安装库的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


@maykie

@NobbZ 所写的内容都适用,此外:

maykie: 我能否强制它在调用 go get/install 命令的模块内存储库?

我猜你指的是 vendoring(依赖项本地化)。是的,这可以做到。

go mod vendor 会将当前模块的所有依赖项下载到一个 “vendor” 文件夹中。

详情请参阅 Go 模块参考 - Go 编程语言

在Go模块项目中,go getgo install 的行为确实是这样的:

  1. go get 会将依赖下载到模块的缓存目录(通常是 $GOPATH/pkg/mod),同时更新 go.modgo.sum 文件
  2. go install 默认会将二进制安装到 $GOPATH/bin,依赖同样会缓存到 $GOPATH/pkg/mod

这是Go模块设计的正常行为,依赖库不会被直接下载到你的项目目录内部。模块系统通过 go.mod 文件来管理依赖版本,实际代码存储在全局缓存中。

如果你想让依赖出现在项目目录中,可以使用 vendor 目录:

# 初始化vendor目录
go mod vendor

# 构建时使用vendor中的依赖
go build -mod=vendor

或者直接查看依赖代码:

# 查看依赖在缓存中的位置
go list -m -f '{{.Path}} => {{.Replace}} {{.Dir}}' all

# 打开特定依赖的目录
cd $(go list -m -f '{{.Dir}}' github.com/example/library)

对于可执行工具的安装位置,可以修改:

# 安装到当前目录
go install -o ./my-tool github.com/example/tool

# 或者设置GOBIN环境变量
export GOBIN=$(pwd)/bin
go install github.com/example/tool

模块系统这样设计是为了避免在不同项目中重复下载相同的依赖,提高构建效率。依赖统一管理在全局缓存中,通过版本哈希确保一致性。

回到顶部