跳到主要内容

Go 的包管理器

Go Modules 的使用​

GoMOD 就是 Go 的 Maven,用于管理依赖

使用起来也非常简单,常用命令就一个 go mod tidy,通俗来说就是将当前的库源码文件所依赖的包,全部安装并记录下来,多的包就删掉,少了的就自动补上

初始化项目​

go mod init ProjectName

这将创建模块配置文件 go.mod,其中包含模块名称和版本。

module PJ01

go 1.17

此 go.mod 文件定义 Module 的根,go 命令将相应地与包一起使用。

编译项目​

随便创建一个 main.go 文件

package main

import "fmt"

func main() {
fmt.Println("Hello, World!")
}

运行 go build 构建项目,可以发现生成了 exe 文件

或者执行以下命令直接运行

go run main.go

编写完代码后执行 go mod tidy 会自动下载依赖的库,也会删除多余的库

交叉编译​

Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序

Linux 下编译 Mac 和 Windows 64位可执行程序

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Windows 下编译 Mac 和 Linux 64位可执行程序

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) GOARCH:目标平台的体系架构(386、amd64、arm) 交叉编译不支持 CGO 所以要禁用它

get 命令​

go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。

参数介绍:

-u:用于下载指定的路径包及其依赖包,默认情况下,不会下载本地已经存在的,只会下载本地不存在的代码包。就是口中常说的更新包 比如:go get -u github.com/jinzhu/gorm。会把最新的 gorm 包下载到你本地

-fix:让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。比如,我的代码是用 1.7 开发的,现在 go 版本已经是1.13 了,有些包已经发生了变化,那么我们在使用 go get 命令的时候可以加入 -fix 标记。这个标记的作用是在检出代码包之后,先对该代码包中不符合 Go 语言 1.7 版本的语言规范的语法进行修正,然后再下载它的依赖包,最后再对它们进行编译和安装。

vendor 是什么?​

下载别人的项目发现有个 vendor 文件夹,里面包含了各个版本依赖,所以这个 vendor 是什么?

go vendor 是 golang 引入管理包依赖的方式,1.5 版本开始引进,1.6 正式引进。其实就是将依赖的包,特指外部包,复制到当前工程下的 vendor 目录下,这样 go build 的时候,go 会优先从 vendor 目录寻找依赖包。

在执行 go build 或 go run 命令时,会按照以下顺序去查找包:

  • 当前包下的 vendor 目录
  • 向上级目录查找,直到找到 src 下的 vendor 目录
  • 在 GOROOT 目录下查找
  • 在 GOPATH 下面查找依赖包

使用 replace 指向本地包​

go 1.18 
use (
./hello
./example
)

replace (
github.com/link1st/example => ./example
)

use 和 replace 都是指定本地项目目录

replace 则表示项目中的 github.com/link1st/example 在本地 ./example1 中找

工作空间是什么?​

目前 go 都是通过 mod 进行包管理,包主要分两类,一类是公网上的,直接引入用 go mod 管理即可。

一类是本地包,比如你自己写的包或者下载到本地的包,对于这类包,在 go 1.18 前,都是通过给 go.mod 中添加 replace 来修改引用包的实际路径。

这种包引用对于 git 提交就非常麻烦,每次提交前需要把 replace 去掉才行。

于是 go work 被发明了出来。go work 即工作空间,就是一个目录(文件夹),里边有一个 go.work 文件。

H:/work/
go.work
- demo/
main.go
go.mod
go.sum

go.work 中的内容如下

go 1.19
use(
H:/information/goserver
./demo
)

注意两个目录路径,工作空间为 H:/work/ 但是模块引用的包路径是 H:/information/goserver,他们可以不在同一个目录下,use 后可以跟相对或者绝对路径。

demo 一旦放在工作空间下,那么,demo 下的 go.mod 寻找就会通过 go.work 来实现,而不能像之前在 demo 下运行 go run 或者 go build 就能自动寻找到 go.mod,所以必须在 work 目录下运行 go use demo,把 "./demo" 添加到 go.work 中,这样你才能在 demo 项目里引用 demo 模块中的包。

工作空间这一层一般都不会进行 git 提交,提交的都是工作空间下的各个项目。

go work init

该命令运行后会生成 go.work 文件。

go.work 推荐在 $GOPATH 路径上,也可以在项目目录任何一级中,比如有个项目在 "/a/b/c/project",go.work 可以在 /a 或者 /a/b 或者 /a/b/c 中,在 /a/b/c 任何一级目录。注意在上一级中已经存在 go.work 则,下级目录中无法创建新的 go.work。

查询 go.work 所在位置可以用命令

go env GOWORK

添加项目到工作空间

# -r 表示递归查找。项目指包含 go.mod 的项目
go work use [-r] [项目1 项目2 ...]

删除用

go work -dropedit=项目

格式化 go.work

go work edit -fmt go.work

References​