IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Go Modules模式 -> 正文阅读

[开发工具]Go Modules模式

Go Modules模式

(1)go mod 命令

命令作用
go mod init生成 go.mod 文件 / 在当前文件夹下初始化一个新的 go.mod 文件
go mod download下载 go.mod 文件中指明的所有依赖 / 下载依赖的module到本地cache
go mod tidy整理现有的依赖 / 增加失去的 module,去掉未用的module
go mod graph查看现有的依赖结构
go mod edit编辑 go.mod 文件
go mod vendor导出项目所有的依赖到 vendor 目录 / 将依赖复制到vendor下
go mod verify校验一个模块是否被篡改过 / 校验依赖,检查下载到第三方库有没有本地修改,如果有修改,则返回非0,否则验证成功。
go mod why查看为什么需要依赖某模块 / 解释为什么需要需要依赖

(2)go mod 环境变量

可以通过 go env 命令来进行查看

GO111MODULE="on"
GOPROXY="https://goproxy.cn,direct"
GOROOT="..."
GOSUMDB="sum.golang.org"
GOTMPDIR=""
...

GO111MODULE

Go 语言提供了GO111MODULE这个环境变量来作为 Go modules 的开关,其允许设置以下参数:

  • auto:只要项目包含了 go.mod 文件的话启用 Go modules。
  • on:启用 Go modules,推荐设置。
  • off:禁用 Go modules,不推荐。

可以通过 go env -w GO111MODULE=on 来设置。

GOPROXY

这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。

  • GOPROXY 的默认值是:https://proxy.golang.org,direct
  • proxy.golang.org 国内访问不了,需要设置国内的代理
    • 阿里云:https://mirrors.aliyun.com/goproxy/
    • 七牛云:https://goproxy.cn,direct
go env -w GOPROXY=https://proxy.golang.org,direct

direct的含义:指示符。指示go回源到模块版本的原地址去拉取。

比如一个模块 “github.com/xxx/json”,首先会到https://proxy.golang.org中去抓取,如果找不到,会去github.com/xxx/json源本身去拉取。

--------### GOPRIVATE

GONOPROXY/GONOSUMDB/GOPRIVATE,通过设置GOPRIVATE即可。

设置方式:

go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx"
# git.example.com 比如是公司内部的仓库的名称,或者是私有仓库
# 设置了这个参数,即当我们导包的时候,不会去GOPROXY的地址下载,即设置了GOPRIVATE,会覆盖GOPROXY和GOSUMDB
# 可以通过通配符去设置 

go env -w GOPRIVATE="*.example.com"
# 凡是这个后缀的模块路径,都会走这个私有仓库,不会经过GOPROXY

或者通过 Linux export 环境方式也可以设置


使用 Go Modules 初始化项目

(1)开启 Go Modules

go env -w GO111MODULE=on

又或是可以通过直接设置系统环境变量(写入对应的~/.bash_profile 文件亦可)来实现这个目的:

export GO111MODULE=on

(2)初始化项目

创建项目目录

mkdir -p $HOME/aceld/modules_test
cd $HOME/aceld/modules_test

执行 Go modules 初始化

go mod init github.com/aceld/modules_test
# github.com/aceld/modules_test —— 这个名称决定了你导包的名称,是你本项目的名称
# 创建了一个 go.mod 文件,出现这个,表示创建成功

在执行 go mod init 命令时,我们指定了模块导入路径为 github.com/aceld/modules_test。接下来我们在该项目根目录下创建 main.go 文件,如下:

vim main.go

内容为:

import (
	"fmt"
	"github.com/aceld/zinx/ziface"
	"github.com/aceld/zinx/znet"
)

//ping test 自定义路由
type PingRouter struct {
	znet.BaseRouter
}

//Ping Handle
func (this *PingRouter) Handle(request ziface.IRequest) {
	//先读取客户端的数据
	fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))

    //再回写ping...ping...ping
	err := request.GetConnection().SendBuffMsg(0, []byte("ping...ping...ping"))
	if err != nil {
		fmt.Println(err)
	}
}

func main() {
	//1 创建一个server句柄
	s := znet.NewServer()

	//2 配置路由
	s.AddRouter(0, &PingRouter{})

	//3 开启服务
	s.Serve()
}

下载包

(base) ?  modules_test ls
go.mod  main.go
(base) ?  modules_test pwd  
/Users/username/aceld/modules_test
(base) ?  modules_test go get github.com/aceld/zinx/znet
go: downloading github.com/aceld/zinx v1.0.1
go: added github.com/aceld/zinx v1.0.1
(base) ?  modules_test go get github.com/aceld/zinx/ziface

生成 go.sum

启动程序

go run main.go

现在的 go.mod 文件内容:

module github.com/aceld/modules_test

go 1.18

require github.com/aceld/zinx v1.0.1 // indirect
// 导入的包。  版本号。 indirect:表示间接依赖,在代码中依赖的是zinx下的ziface和znet,并没有依赖zinx本身

go.sum 文件:作用是当前的库是完整的库,校验是正确的。

表示依赖的模块名称、版本号、h1+hash(go.mod h1+hash)

  • h1+hash(没有go.mod):表示将目标文件的zip压缩包打开之后,针对所有文件校验和来生成的hash(库里所有的包的值统一做哈希,保证所有文件的完整性)
    • 如果不存在,可能表示依赖到库可能用不上
  • go.mod h1+hash:对mod做了哈希

下载的包实际上被下载到哪儿了呢?

/Users/username/goproject/pkg/mod/github.com/aceld/zinx@v1.0.1

修改项目模块的版本依赖关系

go mod edit -replace=zinx@1.1.0=zinx@1.2.0

安装包

1、go get (全局)

  • 受网络原因限制

2、go download (全局)

依赖包会自动下载到 $GOPATH/pkg/mod,多个项目可以共享缓存的mod,注意使用go mod download 的时候首先需要在你的项目里面引入第三方包。

3、go mod vender(本项目)(主用)

  • 将依赖复制到当前项目的vendor下(本项目)

【注意】

使用 go mod vendor 的时候首先需要在你的项目里面引入第三方包

函数init执行顺序

init函数会自动执行

main => import A => import B => import C
C.init() => B.init() => A.init() => main.init()
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:10:55  更:2022-07-04 23:11:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 18:50:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码