乐趣区

关于golang:go系列2go-的包管理工具go-modules的使用

背景

因为之前写 k8s operator 在引入 go 的包的时候,波及到 go 的包管理工具, 因为本人写 java 曾经很多年,maven 的包管理工具很是好用,便想到 golang 是否也有相似的工具,goer 都晓得 go 的包引入带上 github.com 相似的前缀,就会主动从 go 的第三方检索服务 pkg.go.dev 下载对应的文件,而该检索服务会定期从 github 更新最新的代码。

go mod 是 golang 1.11 版本引入的。绝对于之前要么是没有包治理,要么是管理工具不好用

应用

  1. 查看 golang 的版本,确保在 1.11 及以上版本

go version
go version go1.15.2 darwin/amd64

  1. 设置 GO111MODULE 为 on

GO111MODULE 有三个值 : off,on,auto(默认)

  • off 敞开 go mod 的性能,查找包沿用一起的 GOPATH 模式或者通过 vendor 目录形式
  • on 开启 go mod 性能,不会去查找 GOPATH 目录
  • auto,分状况,

    1. 当前目录在 GOPATH/src 之外且该目录蕴含 go.mod 文件,会开启 go mod 性能
    2. 以后文件在蕴含 go.mod 文件的目录上面
  1. 初始化我的项目
    间接在以后我的项目下执行 go mod init, 则会在以后我的项目下建设 go.mod 文件
    如果该我的项目在 GOPATH 目录下, 且没设置 GO111MODULE 为 on,则会报错:
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

再执行go build 则会把我的项目依赖的文件主动增加到 go.mod 中且会生成 go.sum 文件,
如果有存在包依赖冲问题,间接批改依照提醒批改 go.mod 文件对应的版本就能够。
如:

../../../../pkg/mod/k8s.io/client-go@v11.0.0+incompatible/kubernetes/scheme/register.go:26:2: module k8s.io/api@latest found (v0.19.4), but does not contain package k8s.io/api/auditregistration/v1alpha1
go.mod  
module github.com/monkeyboy123/custom-controller

go 1.15

require (
    github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
    github.com/imdario/mergo v0.3.11 // indirect
    golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
    k8s.io/api v0.19.4 // indirect
    k8s.io/apimachinery v0.19.4
    k8s.io/client-go v11.0.0+incompatible
    k8s.io/klog v1.0.0 // indirect
    k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
)

间接批改 k8s.io/client-go v11.0.0+incompatible 为 k8s.io/client-go v0.19.4 即可

对于应用 go mod 治理的话,依赖包的下载会下到 $GOPATH/pkg/mod 目录下, 而不再是 $GOPATH/src 目录下

退出移动版