【go系列3】go 的包管理工具go modules的使用

简介: 【go系列3】go 的包管理工具go modules的使用

背景


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


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


使用


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

go version

go version go1.15.2 darwin/amd64

设置GO111MODULE为on

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

off 关闭go mod的功能,查找包沿用一起的GOPATH模式或者通过vendor目录方式

on 开启go mod功能,不会去查找GOPATH目录

auto,分情况,

当前目录在GOPATH/src之外且该目录包含go.mod文件,会开启go mod功能

当前文件在包含go.mod文件的目录下面

初始化项目

直接在当前项目下执行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 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管理的话,依赖包的下载会下到 G O P A T H / p k g / m o d 目 录 下 , 而 不 再 是 GOPATH/pkg/mod目录下,而不再是 GOPATH/pkg/mod目录下,而不再是GOPATH/src目录下


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7天前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
29 7
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
21天前
|
Go 索引
go语言使用strings包
go语言使用strings包
23 3
|
1月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
31 3
|
1月前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
14 2
|
2月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
3月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
67 3
|
4月前
|
Kubernetes 数据可视化 Java
|
4月前
|
Go 开发者
|
4月前
|
算法 测试技术 Go
|
4月前
|
编译器 Go 开发者