1.GOPATH:
如果想确认GOPATH的路径.则可以通过go env来看Go当前编译器所依赖的环境变量有哪些.其中就可以看到GOPATH环境变量.指令及结果如下.
go env
GOPATH目录下一共包含三个子目录.分别如下.
bin:
存储所编译生成的二进制文件.
pkg:
存储预编译的目标文件.以加快程序的后续编译速度.
src:
存储所有.go文件或源代码.在编写Go应用程序 程序包和库时.一般会以$GOPATH/src/github.com/foo/bar路径进行存放.
因此使用GOPATH的模式下.需要将应用代码存放在固定的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/
如果设置国内的镜像源.修改后的代码如下.
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 欢迎大家访问.提意见.