Go依赖管理

0 阅读4分钟

1.GOPATH:

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

go env

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

bin:

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

pkg:

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

src:

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

因此使用GOPATH的模式下.需要将应用代码存放在固定的GOPATH/src目录下.并且如果执行gotest来拉取外部依赖.则会自动下载并安装到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的默认值为proxy.golang.org,direct.如果无法访问.则需要设置国内代理.

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

七牛云:goproxy.cn,direct

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

go env -w GOPROXY=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本身.

语雀地址www.yuque.com/itbosunmian…?

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