Go依赖管理

1.GOPATH:

如果想确认GOPATH的路径.则可以通过go env来看Go当前编译器所依赖的环境变量有哪些.其中就可以看到GOPATH环境变量.指令及结果如下.

go env

GOPATH目录下一共包含三个子目录.分别如下.

bin:

存储所编译生成的二进制文件.

pkg:

存储预编译的目标文件.以加快程序的后续编译速度.

src:

存储所有.go文件或源代码.在编写Go应用程序 程序包和库时.一般会以$GOPATH/src/github.com/foo/bar路径进行存放.

因此使用GOPATH的模式下.需要将应用代码存放在固定的GOPATH/src目录下.并且如果执行go test来拉取外部依赖.则会自动下载并安装到GOPATH目录下.

2.GOPATH弊端:

1.无版本控制概念.在执行go test的时候.无法传达任何版本信息.也就是说无法知道当前更新的是哪一个版本.也无法通过指定来拉取所期望的具体版本.

2.无法与第三方版本号同步.在运行Go应用程序的时候.无法保证其他人所期望依赖的第三方库使用的是相同的版本.也就是说在项目依赖的管理上.无法保证所有人的依赖版本都一致.

3.无法指定当前项目引用的第三方版本号.没办法处理v1 v2 v3等不同版本的引用问题.因为GOPATH模式下导入的路径都是一样的.即都是github.com/foo/bar.

3.Go Modules模式:

go mod命令:

go mod init:

生成go.mod文件.

go mod download:

下载go.mod文件中指明的所有依赖.

go mod tidy:

整理现有的依赖.

go mod graph:

查看现有的依赖结构.

go mod edit:

编辑go.mod文件.

go mod vendor:

将项目所有依赖导到vendor目录.

go mod verify:

校验一个模块是否被篡改过.

go mod why:

查看为什么需要依赖某模块.

go mod 环境变量:

可以通过go env命令查看.

GO111MODULE:

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

auto:

只要项目包含了go.mod文件启用Go modules.目前在Go1.11~Go1.14版本仍然是默认值.

on:

启用Go modules.推荐设置.

off:

禁用Go modules.不推荐设置.

如果希望开启Go modules模式.可以通过下面语句设置.

go env -w GO111MODULE = on

GOPROXY:

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

GOPROXY的默认值为https://proxy.golang.org,direct.如果无法访问.则需要设置国内代理.

阿里云:https://mirrors.aliyun.com/goproxy/

七牛云:https://goproxy.cn,direct

如果设置国内的镜像源.修改后的代码如下.

go env -w GOPROXY=https://goproxy.cn,direct

direct:

direct是一个特殊指示符.用于指示Go回源到模块版本的源地址去抓取.场景如下.当值列表中上一个Go模块代理返回404或401错误时.Go自动尝试列中的下一个.遇见direct是回源.也就是回到源地址去抓取.而遇见EOF时终止抛出类似的invalid version:unknown revision...的错误.

GOSUMDB:

它的值是一个Go Checksum Database.用于在拉取模块版本时(无论是从源站拉取还是通过Go Module Proxy拉取)保证拉取的模块版本数据未经过篡改.若发现不一致.则表示可能存在篡改.将会立即终止.

GOSUMDB的默认值为sum.golang.org.在国内通常无法访问.但是GOSUMDB可以被Go模块代理所代理.

因此可以通过设置GOPROXY来解决.而先前设置的模块代理goproxy.cn就支持代理sum.golang.org.所以这一个问题在设置GOPROXY后.

若对GOSUMDB的值有自定义需求.则可自定义.支持的格式如下.

模式1:<SUMDB_NAME>+<PUBLIC_KEY>

模式2:<SUMDB_NAME>+<PUBLIC_KEY><SUMDB_URL>

也可以将其设置为off.也就是禁止Go在后续操作中校验模块版本.

GONOPROXY/GONOSUMDB/GOPRIVATE:

这三个环境变量都用在当前项目依赖的私有模块.例如公司的私有Git仓库.或GitHub中的私有仓库.这些都属于私有模块.都要进行设置.否则会拉取失败.

更细致的讲.就是依赖了由GOPROXY指定的Go模块代理或由GOSUMDB指定的Go Checksum Database都无法访问的模块时的场景.

一般建议直接设置GOPRIVATE.它的值将作为GONOPROXY和GONOSUMDB的默认值.所以建议直接使用.

并且它们的值都是一个以英文逗号","分割的模块路径前缀.也就是可以设置多个.指令如下.

go env -w GOPRIVATE = "git.example.com,github.com/aceld"

设置后前缀为git.xxx.com的模块都会被认为是私有模块.

如果不想每次都重新设置.则可以利用通配符.

go env -w GOPRIVATE = "*.example.com"

这样设置.所有模块路径为example.com的子域名(例如:git.example.com)都将不经过Go Module Proxy和Go Checksum Database.但不包括example.com本身.

语雀地址https://www.yuque.com/itbosunmianyi/xg8vfe?

《Go.》 密码:xbkk 欢迎大家访问.提意见.

相关推荐
liudanzhengxi1 小时前
CUDA转OpenCL:跨平台内核迁移实战
开发语言
吃好睡好便好1 小时前
用if…elseif…end语句输出成绩等级
开发语言·前端·javascript·数据库·学习·matlab·信息可视化
努力努力再努力wz1 小时前
【Redis入门系列】:Redis 内部编码机制与 String 深度解析:SDS 底层实现、三种编码与核心命令详解
c语言·开发语言·数据结构·数据库·c++·redis·缓存
必胜刻1 小时前
Go 调用Coze工作流实现 AI 游戏生成
开发语言·ai·golang·gin
夕除1 小时前
spring boot 12
java·开发语言·python
Brilliantwxx1 小时前
【C++】 认识STL set与map(基础接口+题目OJ运用)
开发语言·数据结构·c++·笔记·算法
Huangjin007_1 小时前
【C++ STL篇(十一)】深入浅出红黑树:从原理到实现,一篇搞定
开发语言·c++
Mahir081 小时前
Spring 全家桶常见注解全解:从入门到精通
java·后端·spring·面试·常见注解
fqbqrr1 小时前
2605C++,C++继承类实现调试器
开发语言·c++