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