golang笔记05--go语言的依赖管理

1 介绍

本文继上文 ​​golang笔记04–golang 面向对象​​​, 进一步了解 go语言的依赖管理和相应注意事项。
具体包括 :依赖管理、GOPATH 和 GOVENDOR、go mode的使用、目录的整理等内容。

2 go语言的依赖管理

2.1 依赖管理

依赖管理的三个阶段包括: GOPATH,GOVENDRO, go mod。

2.2 GOPATH 和 GOVENDOR

GOPATH:
GOPATH 默认在~/go 目录下面;以下案例直接通过idea的go来新建项目,项目存放在 /tmp/gopathtest/src 下面。

mkdir /tmp/gopathtest
export GOPATH=/tmp/gopathtest
mkdir /tmp/gopathtest/src
在 idea 中设置project 的gopath为 /tmp/gopathtest, 然后在idea的cmd中go env 确认gopath已经被修改
idea cmd 中执行如下内容:
export GO111MODULE=off
go get -u go.uber.org/zap
/tmp/gopathtest/test01$ ls /tmp/gopathtest/src/
go.uber.org

vim zaptest.go
package main

import "go.uber.org/zap"

func main(){
log, _ := zap.NewProduction()
log.Warn("Warning test")
}
输出:
{"level":"warn","ts":1613297107.1154358,"caller":"test01/zaptest.go:7","msg":"Warning test"}

运行前需要在 Edit Configurations 的Go Build 中添加 Environment,值为 GO111MODULE=off,如下图所示:

golang笔记05--go语言的依赖管理_golang


GOVENDOR:

如果需要多个项目需要使用某个库的不同版本的情况,那么就可以使用govendor功能了,具体就是在每个项目下面新建一个vendor,然后将对应版本的库拷贝到vendor中,那么就会先去vendor下找对应的库文件,然后再去全局 gopath 的 src下找,最后会去非全局的 gopath 的 src下找。

golang笔记05--go语言的依赖管理_go mod_02

2.3 go mod 的使用

go mod 相比gopath 和 govendor 更加高级,可以很方便的管理所需的库;
其由 go 命令统一管理,用户不必担心目录结构;
初始化直接使用 go mod init mode-name 即可;
追加依赖时直接使用 go get 即可;

在idea 中通过 go mod 新建 gomodtest项目,存储位置随意即可;

然后在cmd 中 go get -u go.uber.org/zap ,zap拉取完毕后可以发现 go.mod 中也更新了一些require的内容,而且会生成一个go.sum文件,如下图所示:

golang笔记05--go语言的依赖管理_golang_03

vim zaptest.go
package main

import "go.uber.org/zap"

func main(){
log, _ := zap.NewProduction()
log.Warn("Warning test")
}
输出:
{"level":"warn","ts":1613298806.0578163,"caller":"gomodtest/zaptest.go:7","msg":"Warning test"}

此时go 的 zap.NewProduction 会从go/pkg/mod/go.uber.org/zap@v1.16.0/logger.go 中查找,如下图。

golang笔记05--go语言的依赖管理_golang_04


使用 go mod 管理库后,如果项目需要更改依赖的版本,则直接在 go.mod 中修改require的库的版本号即可,在编译的时候会自动下载对应的版本。

如果旧项目迁移,在项目根目录下执行 go mod init 和 go build ./… 就会通过 go mod 的方式快速获取所有需要的依赖库。

2.4 目录的整理

对于项目目录和文件的规范性方面,可以通过 go build ./… 来检查是否有异常。

例如,同一个目录下多个文件都有package main,那么build会出错;

正确的做法是每个package 单独放在指定的目录中,如下图所示:

golang笔记05--go语言的依赖管理_golang_05

3 注意事项

  1. 使用gopath的时候,如果找不到指定的库,则会先到全局gopath的src下找,然后会在非全局的gopath的src下找。

4 说明

  1. 软件环境
    go版本:go1.15.8
    操作系统:Ubuntu 20.04 Desktop
    Idea:2020.01.04