这是我参与「第五届青训营 」伴学笔记创作活动的第2天,在过去几天,我学习了go语言的依赖管理与工程实践。
1. GO语言的依赖管理
1.1 GOPATH下管理
安装GO之后配置环境变量GOPATH,GOPATH对应的目录即go项目存放的路径。项目代码直接依赖src下的源码,通过go get下载最新版本的包到src下。
问题:无法实现package的多版本控制。、
1.2 GO Vendor
项目目录下增加vendor文件,所有依赖包副本形式放在 $ProjectRoot/vender
依赖寻址方式:vendor => GOPATH
问题:无法控制依赖的版本
1.3 Go Module
通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包
1.3.1使用方法
- 使用
go module管理依赖的go项目需要创建在GOPATH/src之外的目录中(因为如果在GOPATH/src中使用go module管理,即使存在go.mod文件,所有的go命令还是在旧的GOPATH模式下执行),这里假设为_/home/gopher/hello。 - 通过go mod init命令创建go.mod文件:
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
查看go.mod文件:
$ cat go.mod
module example.com/hello
go 1.12
$
- 在hello目录下创建文件hello.go:
package hello
func Hello() string {
return "Hello, world."
}
以及hello_test.go:
package hello
import "testing"
func TestHello(t *testing.T) {
want := "Hello, world."
if got := Hello(); got != want {
t.Errorf("Hello() = %q, want %q", got, want)
}
}
使用go test测试文件:
$ go test
PASS
ok _/home/gopher/hello 0.020s
$
- 在hello文件中添加依赖rsc.io/quote
package hello
import "rsc.io/quote"
func Hello() string {
return quote.Hello()
}
通过go get rsc.io/quote 命令下载包,包的副本会保存在GOPATH/pkg中,同时go.mod文件会自动更新
$ cat go.mod
module example.com/hello
go 1.12
require rsc.io/quote v1.5.2
$
1.3.2 GOPROXY
VSCode中存在go get命令无法下载go tools的问题,经过查阅相关资料得到结论是需要设置代理,使用命令go env来设置代理
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.io,direct
Go Module通过GOPROXCY环境变量控制如何使用Go Proxy;GOPROXY是一个Go Proxy站点URL列表,可以使用"direct"表示源站。对于示例配置,整体的依赖寻址路径,会优先从proxy1下载依赖,如果proxy1不存在,会下钻proxy2寻找,如果proxy2中不存在则会回源到源站直接下载依赖,缓存到proxy站点中。