Go语言go mod包依赖管理工具使用详解
来源:云海天教程
时间:2022-12-28 13:56:23 265浏览 收藏
在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Go语言go mod包依赖管理工具使用详解》,聊聊package,希望可以帮助到正在努力赚钱的你。
go modules 是 golang 1.11 新加的特性。现在 1.12 已经发布了,是时候用起来了。Modules 官方定义为:模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。modules 替换旧的基于 GOPATH 的方法来指定在给定构建中使用哪些源文件。
如何使用 Modules?
1) 首先需要把 golang 升级到 1.11(现在 1.12 已经发布了,建议使用 1.12)2) 设置 GO111MODULE
GO111MODULE
GO111MODULE 有三个值:off, on 和 auto(默认值)。GO111MODULE=off,go 命令行将不会支持 module 功能,寻找依赖包的方式将会沿用旧版本那种通过 vendor 目录或者 GOPATH 模式来查找。GO111MODULE=on,go 命令行会使用 modules,而一点也不会去 GOPATH 目录下查找。GO111MODULE=auto,默认值,go 命令行将会根据当前目录来决定是否启用 module 功能。这种情况下可以分为两种情形:当前目录在 GOPATH/src 之外且该目录包含 go.mod 文件当前文件在包含 go.mod 文件的目录下面。
当 modules 功能启用时,依赖包的存放位置变更为 $GOPATH/pkg,允许同一个 package 多个版本并存,且多个项目可以共享缓存的 module。
go mod
golang 提供了 go mod 命令来管理包。go mod 有以下命令:
如何在项目中使用
【示例 1】创建一个新项目1) 在 GOPATH 目录之外新建一个目录,并使用
go mod init
初始化生成 go.mod 文件~ mkdir hello
~ cd hello
hello go mod init hello
go: creating new go.mod: module hello
hello ls
go.mod
hello cat go.mod
module hello
go 1.12
go.mod 提供了 module, require、replace 和 exclude 四个命令
module 语句指定包的名字(路径)require 语句指定的依赖项模块replace 语句可以替换依赖项模块exclude 语句可以忽略依赖项模块
2) 添加依赖
新建一个 server.go 文件,写入以下代码:
package mainimport ( "net/http" "github.com/labstack/echo")func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323"))}执行go run server.go
运行代码会发现 go mod 会自动查找依赖自动下载:
$ go run server.go
go: finding github.com/labstack/echo v3.3.10+incompatible
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: extracting github.com/labstack/echo v3.3.10+incompatible
go: finding github.com/labstack/gommon/color latest
go: finding github.com/labstack/gommon/log latest
go: finding github.com/labstack/gommon v0.2.8
# 此处省略很多行
...
____ __
/ __/___/ / ___
/ _// __/ _ / _
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O
⇨ http server started on [::]:1323
$ cat go.mod
module hello
go 1.12
require (
github.com/labstack/echo v3.3.10+incompatible // indirect
github.com/labstack/gommon v0.2.8 // indirect
github.com/mattn/go-colorable v0.1.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/valyala/fasttemplate v1.0.0 // indirect
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
)
$ cat go.sum
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
... 省略很多行
go run server.go
发现跳过了检查并安装依赖的步骤。可以使用命令
go list -m -u all
来检查可以升级的 package,使用go get -u need-upgrade-package
升级后会将新的依赖版本更新到 go.mod * 也可以使用 go get -u 升级所有依赖go get 升级有一下几种方法:
运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z 是修订版本号,y 是次要版本号)运行 go get -u=patch 将会升级到最新的修订版本运行 go get package@version 将会升级到指定的版本号 version运行 go get 如果有版本的更改,那么 go.mod 文件也会更改
【示例 2】改造现有项目 (helloword)
项目目录为:
$ tree
.
├── api
│ └── apis.go
└── server.go
1 directory, 2 files
package mainimport ( api "./api" // 这里使用的是相对路径 "github.com/labstack/echo")func main() { e := echo.New() e.GET("/", api.HelloWorld) e.Logger.Fatal(e.Start(":1323"))}api/apis.go 源码为:
package apiimport ( "net/http" "github.com/labstack/echo")func HelloWorld(c echo.Context) error { return c.JSON(http.StatusOK, "hello world")}1) 使用go mod init ***
初始化 go.mod
$ go mod init helloworld
go: creating new go.mod: module helloworld
go run server.go
go: finding github.com/labstack/gommon/color latest
go: finding github.com/labstack/gommon/log latest
go: finding golang.org/x/crypto/acme/autocert latest
go: finding golang.org/x/crypto/acme latest
go: finding golang.org/x/crypto latest
build command-line-arguments: cannot find module for path _/home/gs/helloworld/api
build command-line-arguments: cannot find module for path _/home/gs/helloworld/api
但是 go.mod 已经更新:$ cat go.mod
module helloworld
go 1.12
require (
github.com/labstack/echo v3.3.10+incompatible // indirect
github.com/labstack/gommon v0.2.8 // indirect
github.com/mattn/go-colorable v0.1.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/valyala/fasttemplate v1.0.0 // indirect
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
)
这是因为 server.go 中使用 internal package 的方法跟以前已经不同了,由于 go.mod 会扫描同工作目录下所有 package 并且变更引入方法,必须将 helloworld 当成路径的前缀,也就是需要写成 import helloworld/api,以往 GOPATH/dep 模式允许的 import ./api 已经失效,详情可以查看这个 issue。
3) 更新旧的 package import 方式
所以 server.go 需要改写成:
package mainimport ( api "helloworld/api" // 这是更新后的引入方法 "github.com/labstack/echo")func main() { e := echo.New() e.GET("/", api.HelloWorld) e.Logger.Fatal(e.Start(":1323"))}
4) 到这里就和新创建一个项目没什么区别了一个小坑:开始在 golang1.11 下使用 go mod 遇到过 go build github.com/valyala/fasttemplate: module requires go 1.12 这种错误,遇到类似这种需要升级到 1.12 的问题,直接升级 golang1.12 就好了。
使用 replace 替换无法直接获取的 package
由于某些已知的原因,并不是所有的package都能成功下载,比如:golang.org 下的包。modules 可以通过在 go.mod 文件中使用 replace 指令替换成 github 上对应的库,比如:
replace (
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)
replace golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
终于介绍完啦!小伙伴们,这篇关于《Go语言go mod包依赖管理工具使用详解》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
-
113 收藏
-
500 收藏
-
172 收藏
-
464 收藏
-
105 收藏
-
165 收藏
-
473 收藏
-
377 收藏
-
384 收藏
-
246 收藏
-
110 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 开心的板栗
- 细节满满,收藏了,感谢楼主的这篇博文,我会继续支持!
- 2023-03-02 01:48:00
-
- 单身的路灯
- 这篇文章出现的刚刚好,太全面了,太给力了,已加入收藏夹了,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-02-10 21:49:38
-
- 阳光的心情
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享技术贴!
- 2023-01-21 19:09:08
-
- 酷酷的金毛
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术文章!
- 2023-01-14 00:13:32
-
- 寂寞的外套
- 这篇博文真是及时雨啊,很详细,太给力了,码住,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-01-01 23:06:33