GO后端开发|青训营笔记

76 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第2天,在过去几天,我学习了go语言的依赖管理与工程实践。

1. GO语言的依赖管理

1.1 GOPATH下管理

安装GO之后配置环境变量GOPATHGOPATH对应的目录即go项目存放的路径。项目代码直接依赖src下的源码,通过go get下载最新版本的包到src下。

image.png

问题:无法实现package的多版本控制。、

1.2 GO Vendor

项目目录下增加vendor文件,所有依赖包副本形式放在 $ProjectRoot/vender

依赖寻址方式:vendor => GOPATH

image.png

问题:无法控制依赖的版本

1.3 Go Module

通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包

1.3.1使用方法

  1. 使用go module管理依赖的go项目需要创建在GOPATH/src之外的目录中(因为如果在GOPATH/src中使用go module管理,即使存在go.mod文件,所有的go命令还是在旧的GOPATH模式下执行),这里假设为_/home/gopher/hello。
  2. 通过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
$
  1. 在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
$
  1. 在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站点中。

引用

go.dev/blog/using-…