在GOPATH之外使用dep的正确方法?

在GOPATH之外使用dep的正确方法? 你好,

到目前为止,我一直在使用 Go 模块。我正在使用 Kubeless(Kubernetes 无服务器框架)实现一个 Golang Lambda 函数,而它只支持 dep(依赖项通过 Gopkg.toml 文件管理)。

我假设,如果我在 GOPATH 之外工作,就必须将 Go 模块与 dep 一起使用。我的理解对吗? 这感觉不太方便,因为两者可能都会想要创建 vendor 目录(我认为)。

谢谢

1 回复

在 GOPATH 之外使用 dep 是完全可行的,不需要依赖 Go 模块。dep 本身不要求项目必须在 GOPATH 内,但需要正确设置环境变量和项目结构。以下是具体步骤:

  1. 设置 GO111MODULE=off
    确保禁用 Go 模块,因为 dep 与 Go 模块不兼容:

    export GO111MODULE=off
    
  2. 初始化 dep 项目
    在项目根目录运行 dep init,这会生成 Gopkg.tomlGopkg.lock 文件:

    cd /your/project/path
    dep init
    
  3. 管理依赖
    使用 dep ensure 拉取依赖到 vendor 目录:

    dep ensure
    

    添加新依赖时使用:

    dep ensure -add github.com/example/pkg
    
  4. 项目结构示例
    假设项目路径为 ~/projects/myapp(不在 GOPATH 内):

    ~/projects/myapp/
    ├── main.go
    ├── Gopkg.toml
    ├── Gopkg.lock
    └── vendor/ (由 dep ensure 生成)
    
  5. 构建和运行
    直接使用 go buildgo run,工具链会优先使用 vendor 目录中的依赖:

    go build -o myapp .
    

关键点

  • 确保 GO111MODULE=off,否则 Go 工具会忽略 vendor 目录并尝试使用模块。
  • dep 创建的 vendor 目录是标准行为,与 Go 模块的 vendor 机制类似但独立。
  • 如果 Kubeless 要求特定依赖版本,可在 Gopkg.toml 中通过 [[constraint]] 指定。

示例 Gopkg.toml 约束依赖版本:

[[constraint]]
  name = "github.com/example/pkg"
  version = "=v1.2.3"

这样即可在 GOPATH 外正常使用 dep,无需启用 Go 模块。

回到顶部