前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Golang Module的使用 顶

Golang Module的使用 顶

作者头像
BGBiao
发布于 2019-09-09 08:42:37
发布于 2019-09-09 08:42:37
1.3K00
代码可运行
举报
文章被收录于专栏:容器云生态容器云生态
运行总次数:0
代码可运行

前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制。

注意:

  • 在Golang1.11版本中需要使用export GO111MODULE=on来显式开启go module
  • 在Golang1.12之后默认开启了module

Golang Module快速入门

初始化项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在GOPATH之外创建一个项目目录
➜  mkdir cmdb-job

# 进入目录后初始化一个module
➜  cd cmdb-job
➜  go mod init cmdb-job
go: creating new go.mod: module cmdb-job

# 查看生成的mod.md
➜  cat go.mod
module cmdb-job

go 1.12

# 使用第三方模块编写一丢丢代码逻辑
# 一个字符串简单几种加密方式的简单工具
➜ cat main.go
/*================================================================
*Copyright (C) 2019 BGBiao Ltd. All rights reserved.
*
*FileName:main.go
*Author:BGBiao
*Date:2019年09月07日
*Description:
*
================================================================*/
package main
import (
    "fmt"
    "github.com/xxbandy/go-utils/crypto"
)

func main() {
	fmt.Println(crypto.Md5("hello"))
	fmt.Println(crypto.Hmac("key2", "hello"))
	fmt.Println(crypto.Sha1("hello"))
	fmt.Println(crypto.HmacSha1("key2", "hello"))
}

# 查看下项目结构和依赖
➜ tree -L 1 .
.
├── go.mod
├── go.sum
└── main.go

测试运行项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 测试运行
# 第一次运行会自动检查代码里的第三方依赖包,并下载和接下项目依赖的包
➜  go run main.go
go: finding github.com/xxbandy/go-utils/crypto latest
go: finding github.com/xxbandy/go-utils latest
go: downloading github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
go: extracting github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
5d41402abc4b2a76b9719d911017c592
f1b90b4efd0e5c7db52dfa0efd6521a3
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
79806c50bab4825a371e3c4fff80bae0c731d54e

# 第二次运行
➜  go run main.go
5d41402abc4b2a76b9719d911017c592
f1b90b4efd0e5c7db52dfa0efd6521a3
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
79806c50bab4825a371e3c4fff80bae0c731d54e

# 查看管理mod的依赖配置
## go.mod会记录项目所需依赖以及具体的版本号记录(go-utils这个库没有版本,所以会根据提交日期和commitid来唯一标识版本)
➜  cat go.mod
module cmdb-job

go 1.12

require github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 // indirect

## go.sum文件会记录依赖树的详细信息
➜  cat go.sum
github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 h1:SD6OuR8EUvCmiBDoxItcFYXIMuse45HvuSh3ho0AAeU=
github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2/go.mod h1:XhyyBI+KH4XEIbw3EhMFjZfJcV3kDK4iSAT7zZYd+Uc=

Go Module的其他功能

注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了

go mod的其他特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 执行go help mod可以查看到以下子命令
➜ go help mod
	download    download modules to local cache       # 下载模块包到本地缓存
	edit        edit go.mod from tools or scripts     # 从工具或脚本中修改go.md内容(暂时没觉得很好用)
	graph       print module requirement graph        # 打印模块依赖树
	init        initialize new module in current directory # 在当前目录初始化一个模块
	tidy        add missing and remove unused modules      # 添加或略或删除不使用的包
	vendor      make vendored copy of dependencies         # 将依赖拷贝到vendor中(会将依赖打包到当前目录下的vendor目录)
	verify      verify dependencies have expected content  # 检查依赖内容
	why         explain why packages or modules are needed # 解释为什么哪些包或者模块被需要


# 查看当前项目的依赖树(项目复杂时比较有用)
➜  go mod graph
cmdb-job github.com/xxbandy/go-utils@v0.0.0-20190506113112-d88d469a26b2
# 查看模块或包在哪里被依赖了
➜  go mod why github.com/xxbandy/go-utils/crypto
# github.com/xxbandy/go-utils/crypto
cmdb-job
github.com/xxbandy/go-utils/crypto

# 拷贝一份依赖到项目本地
# 会将项目的依赖包拷贝到项目的vendor目录中
➜  go mod vendor
➜  tree -L 3 .
.
├── go.mod
├── go.sum
├── main.go
└── vendor
    ├── github.com
    │   └── xxbandy
    └── modules.txt

注意:这个时候可能会有人有疑问了,既然go mod vendor将依赖拷贝一份到项目家目录的vendor目录了,那原始的依赖存在哪里?比如我们之前没有依赖管理之前,默认的依赖都是在$GOPATH/src/下面的

其实,在使用了go mod之后,项目依赖的全部依赖包都会在$GOPATH/pkg/mod/cache/download/中统一缓存下来,而项目中的go.md中会记录真正的版本信息,去缓存中引用即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看go mod之后缓存的依赖包
➜  tree -L 3   ${GOPATH}/pkg/mod/cache/download/
${GOPATH}/pkg/mod/cache/download/
└── github.com
    └── xxbandy
        └── go-utils

一个开源项目示例

我们就以golang-gin-vue项目为例来看下go mod的一些功能吧.

golang-gin-vue是一个使用gin框架编写后端接口,结合vue来渲染前端的一个示例项目.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 克隆项目到本地
➜ git clone https://github.com/xxbandy/golang-gin-vue.git

➜  cd golang-gin-vue

# 使用go mod初始化项目
➜  golang-gin-vue git:(master) go mod init golang-gin-vue
go: creating new go.mod: module golang-gin-vue

# 初始化后会默认生成go.mod文件,但是不会加载依赖包,需要go run或者go build来自动加载依赖
➜  golang-gin-vue git:(master) ✗ go build main.go
go: finding github.com/gorilla/mux v1.7.3
go: downloading github.com/gorilla/mux v1.7.3
go: extracting github.com/gorilla/mux v1.7.3

# 查看go.mod文件
➜  golang-gin-vue git:(master) ✗ cat go.mod
module golang-gin-vue
go 1.12
require (
	github.com/gin-gonic/gin v1.4.0 // indirect
	github.com/gorilla/mux v1.7.3 // indirect
)

# 打印依赖树关系
## 基本上可以知道项目和库依赖了哪些库
➜  go mod graph
golang-gin-vue github.com/gin-gonic/gin@v1.4.0
golang-gin-vue github.com/gorilla/mux@v1.7.3
github.com/gin-gonic/gin@v1.4.0 github.com/gin-contrib/sse@v0.0.0-20190301062529-5545eab6dad3
github.com/gin-gonic/gin@v1.4.0 github.com/golang/protobuf@v1.3.1
github.com/gin-gonic/gin@v1.4.0 github.com/json-iterator/go@v1.1.6
github.com/gin-gonic/gin@v1.4.0 github.com/mattn/go-isatty@v0.0.7
github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd
github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/reflect2@v1.0.1
github.com/gin-gonic/gin@v1.4.0 github.com/stretchr/testify@v1.3.0
github.com/gin-gonic/gin@v1.4.0 github.com/ugorji/go@v1.1.4
github.com/gin-gonic/gin@v1.4.0 golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c
github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/assert.v1@v1.2.1
github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/validator.v8@v8.18.2
github.com/gin-gonic/gin@v1.4.0 gopkg.in/yaml.v2@v2.2.2
github.com/stretchr/testify@v1.3.0 github.com/davecgh/go-spew@v1.1.0
github.com/stretchr/testify@v1.3.0 github.com/pmezard/go-difflib@v1.0.0
github.com/stretchr/testify@v1.3.0 github.com/stretchr/objx@v0.1.0
github.com/mattn/go-isatty@v0.0.7 golang.org/x/sys@v0.0.0-20190222072716-a9d3bda3a223
gopkg.in/yaml.v2@v2.2.2 gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405
golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2
golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/text@v0.3.0
golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a

# 查看gin这个模块被哪里需要(golang-gin-vue项目和gin框架本身需要)
➜ go mod why github.com/gin-gonic/gin
# github.com/gin-gonic/gin
golang-gin-vue
github.com/gin-gonic/gin

Tips

我们在使用Golang进行开发过程中,通常会发现各种第三方库会依赖golang.org/x之类的原生库,或者一些其他国外大厂提供的共有库,由于政策原因,我们是无法直接访问国外网站来下载依赖库的(网速也有限制),因此在开发过程中也是比较头疼的. 这个时候通常大家都会去采用访问外国网站,或者通过一些代理的方式来解决. 而在Golang高版本中,包含了goproxy特性,用户可以直接指定代理来下载依赖的第三方库,一方面解决了下载速度的问题,另外一方面也解决了无法访问的第三方库的下载。

注意:goproxy必须在go1.11以上版本,并且开启了go module机制后才能使用的(因为我当前的环境都是1.12,大家可以验证下小版本是否支持)

而在国内,质量比较好的几个goproxy代理大概有如下几个:

go代理使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 开启go module支持
# golang1.11 需要手动开启,golang1.12之后默认会开启
$ export GO111MODULE=on

# 设置代理(上述三个代理地址都可以)
$ export GOPROXY=https://goproxy.cn

# 下载第三方库

$ go get -v golang.org/x/net/websocket
Fetching https://goproxy.cn/golang.org/x/net/websocket/@v/list
Fetching https://goproxy.cn/golang.org/x/net/@v/list
go: finding golang.org/x/net latest
Fetching https://goproxy.cn/golang.org/x/net/@latest
Fetching https://goproxy.cn/golang.org/x/net/@v/v0.0.0-20190827160401-ba9fcec4b297.mod
golang.org/x/net/websocket
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go mod包依赖管理工具使用详解
对比上面几点: 目前做的最好的也就 maven了,gradle没有使用过,不知道。
OwenZhang
2021/12/08
9880
Go mod包依赖管理工具使用详解
用go-module作为包管理器搭建go的web服务器
本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器。并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档。
SH的全栈笔记
2019/10/20
1.7K0
Go Modules 详解
Go 1.11 和 Go 1.12 包含了初步的 Go Modules 支持,且计划在 2019 年 8 月发布的 Go 1.13 会在所有开发过程中默认使用 Go Modules。
码农编程进阶笔记
2021/07/20
8650
Go Modules 详解
层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就“导包”就行了,无论是内部的还是外部的,使用import关键字即可。但事情往往没有那么简单,Go lang在包管理机制上走了不少弯路,虽然1.18版本的包管理已经趋于成熟,但前事不忘后事之师,我们还是需要了解一下这段历史。
用户9127725
2022/09/21
2470
Go编程之相关命令工具记录
该命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装,整个过程类似安装App一样;
全栈工程师修炼指南
2022/09/29
6240
GO 依赖管理工具go Modules(官方推荐)
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。
孤烟
2020/09/27
1.8K1
【One by one系列】一步步学习Golang web框架Gin
cd $gopath\src\github.com\carfield\Webapi
DDGarfield
2022/06/23
2420
Go 编程 | 连载 21 - Go Modules 和 Package
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的共工作目录,GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
RiemannHypothesis
2022/09/28
5200
GOPATH 模式怎么迁移至 Modules 模式?
Go 项目使用多种依赖管理策略。诸如 dep 和 glide 很受欢迎,但是它们在使用上有很大差异,并且并不总是能很好地协同工作。某些项目将其整个 GOPATH 目录存储在单个 Git 存储库中。其他人只是依靠 go get 获取,并期望在 GOPATH 中安装相当新版本的依赖项。
frank.
2020/11/12
2.2K0
2022-04-05:golang中go.mod文件,做框架开发需要解析,请问如何解析?
2022-04-05:golang中go.mod文件,做框架开发需要解析,请问如何解析?
福大大架构师每日一题
2022/04/05
2050
​从一个模块冲突问题学习go module
直接从字面看似乎是符号冲突,类似于C/C++中引入了两个不同的符号,但是go module以后包都是统一放到$GOPATH/pkg下的不应该会出现类似问题。
王沛文
2019/04/23
12.2K4
Golang中的包管理工具 - Go Modules
在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下我本机 $GOPATH/src 下的目录:
猿哥
2019/08/01
1.6K0
Go语言学习(十)| module 使用
go module 是在go 1.11版本才开始有的,需要将环境变量 GO111MODULE 设置为 on 才能正常使用
Mervyn
2020/07/21
3910
跳出Go module的泥潭
Go 1.11 前天已经正式发布了,这个版本包含了两个最重要的feature就是 module和web assembly。虽然也有一些简单的教程介绍了go module的特性,但是基本上都是hello world的例子,在实践的过程中, 很多人都在“拼命的挣扎”,包括我自己, 从一些qq群、github的issue, twitter上都可以看到大家茫然或者抱怨的语句。
李海彬
2018/09/29
1.7K0
跳出Go module的泥潭
[日常] gocron源码阅读-使用go mod管理依赖源码启动gocron
从 Go1.11 开始,golang 官方支持了新的依赖管理工具go mod go mod download: 下载依赖的 module 到本地 cache go mod edit: 编辑 go.mod go mod graph: 打印模块依赖图 go mod init: 在当前目录下初始化 go.mod(就是会新建一个 go.mod 文件) go mod tidy: 整理依赖关系,会添加丢失的 module,删除不需要的 module go mod vender: 将依赖复制到 vendor 下 go mod verify: 校验依赖 go mod why: 解释为什么需要依赖
唯一Chat
2019/11/14
8780
急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00
    在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris。彩虹女神的名号响彻寰宇、名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Iris回眸一笑撩人心扉:“虽然你们也不是那么慢,但我还是快那么一点点......”,本次就让我们来一睹彩虹女神Iris的芳颜,感受宇宙最快Web框架的神乎其神。
用户9127725
2022/09/21
3260
Golang学习笔记,从入门到精通,持续记录
Golang官网:https://go.dev/、Golang下载:https://go.dev/、Golang学习文档:https://go.dev/doc/
房东的狗丶
2023/02/17
1.3K0
GoLang 新版包管理 -- go module 的使用
上一篇文章中,我们介绍了 GoLang 中包的使用与包管理机制。 GoLang 包的使用与管理
用户3147702
2022/06/27
2.4K0
GoLang 新版包管理 -- go module 的使用
Go——依赖管理
在Go1.5 release的版本的发布vendor目录被添加到除了GOPATH和GOROOT之外的依赖目录查找的解决方法。 查找依赖包路径的解决 当前包下的vendor目录 先上级的目录查找,直到找到scr的vendor目录 在GOPATH下面查找依赖包 在GOROOT目录下查找
羊羽shine
2019/05/29
1.4K0
Go依赖管理——Go Mod
module简介 在 go1.12,go发布了官方的包管理工具 Go Module 使用module 生成go.mod 新建一个文件夹作为项目目录,执行 go mod init 模块名称 使用mod初始化项目,生成项目依赖管理文件go.mod 这个文件也可以手动创建,无伤大雅 初始化后的go.mod文件内容如下 module test go 1.14 添加依赖 通过在go.mod中,添加require语句,导入依赖,如 require golang.org/x/text v0.3.0 require g
歪歪梯
2020/10/26
2.1K0
推荐阅读
相关推荐
Go mod包依赖管理工具使用详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验