Go语言常用命令
查看go语言自带命令
查看go自带的命令,在终端输入go命令或者go help
。
go主要命令解释
1. build: 编译包和依赖。
2. clean: 移除当前源码包里面编译生成的文件。
3. doc: 显示包或者符号的文档。
4. env: 打印go的环境信息,查看GOPATH,GOROOT环境变量都可以使用该命令查看。
5. bug: 启动错误报告。
6. fix: 运行go tool fix。
7. fmt: 运行gofmt进行格式化。
8. generate: 从processing source生成go文件。
9. get: 下载并安装包和依赖。
10. install: 编译并安装包和依赖。
11. list: 列出包。
12. run: 编译并运行go程序。
13. test: 自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。
14. tool: 运行go提供的工具。
15. version: 显示当前环境安装go的版本。
16. vet: 运行go tool vet。
Go Module
之前我们go项目都是基于gopath来建立,gopath通常有如下图的目录结构。
GOPATH目录下一共包含了三个子目录,分别是:
-
bin:存储所编译生成的二进制文件。
-
pkg:存储预编译的目标文件,以加快程序的后续编译速度。
-
src:存储所有
.go
文件或源代码。在编写 Go 应用程序,程序包和库时,一般会以$GOPATH/src/github.com/foo/bar
的路径进行存放。
gopath主要有两个作用,一个是保存依赖的代码和可执行文件及pkg目录下的函数库,另一个作用是项目开发工作空间。但是将这两个放在一起是不太方便与开发的,最关键是没有依赖管理。
后来开源社区推出了很多依赖管理工具,目前最主流的包依赖管理方式是使用官方推荐的 Go Module。
go module介绍#
go module是go官方自带的go依赖管理库,它是go相关包依赖的集合,在Go 1.14 版本中正式推荐可以用在生产上,go module由vgo发展而来。
go module组成
go module主要由三部分组成:
1. 集成在go命令里的工具集:提供了download,edit等8个命令,下面会说。
2. go.mod 文件:保存了所有的依赖列表,根据文件中的依赖项顺序。
3. go.sum 文件:主要用于版本的管理,保存了不同的版本所对应的hash值,用于校验依赖从而避免依赖被修改。
一般go.mod 文件和go.sum 文件都是在项目的根目录下面,而且都是通过命令来修改里面的内容。
go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等。
go mod 有以下命令:
命令 | 说明 |
---|---|
download | download modules to local cache(下载依赖的module到本地cache) |
edit | edit go.mod from tools or scripts(编辑go.mod文件) |
graph | print module requirement graph (打印模块依赖图) |
init | initialize new module in current directory(在当前文件夹下初始化一个新的module, 创建go.mod文件) |
tidy | add missing and remove unused modules(增加丢失的module,去掉未用的module) |
vendor | make vendored copy of dependencies(将依赖复制到vendor下,注意依赖需要在import 中声明后才能进行导入) |
verify | verify dependencies have expected content (校验依赖) |
why | explain why packages or modules are needed(解释为什么需要依赖) |
go mod命令使用
1. 使用 go mod init module名:
go mod init通常就是初始化工程项目用的。
我们在本地先建立一个空目录,该目录可以是你本地GOPATH路径任何一个地方。
$ go mod init modDemo go: creating new go.mod: module modDemo $ ll total 8 drwxr-xr-x 3 songguojun staff 96 10 27 14:17 ./ drwxr-xr-x 39 songguojun staff 1248 10 27 14:15 ../ -rw-r--r-- 1 songguojun staff 24 10 27 14:17 go.mod #初始化之后目录多了go.mod文件
查看go.mod文件内容
$ cat go.mod
module modDemo #第一行是当前module的名字
go 1.14 #定义了go使用的版本号
我们在当前目录在创建一个main.go文件,main.go代码如下:
package main import ( "fmt" "github.com/hashicorp/golang-lru" ) func main(){ l, _ := lru.New(128) for i := 0; i < 256; i++ { l.Add(i, nil) } fmt.Println("-->", l.Len()) }
上面代码是引入了go的一个内存排序lru包,我们不用关心。
我们在项目根目录下执行go bulid构建,发现多了go.sum文件和modDemo*文件。
$ go build $ ll total 4344 drwxr-xr-x 6 songguojun staff 192 10 27 14:31 ./ drwxr-xr-x 39 songguojun staff 1248 10 27 14:15 ../ -rw-r--r-- 1 songguojun staff 72 10 27 14:30 go.mod -rw-r--r-- 1 songguojun staff 181 10 27 14:30 go.sum -rw-r--r-- 1 songguojun staff 194 10 27 14:31 main.go -rwxr-xr-x 1 songguojun staff 2209672 10 27 14:31 modDemo*
看下go.sum文件内容,里面包含了就是一些hash值。
songguojundeMacBook-Pro:gomodule songguojun$ cat go.sum github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
2. go mod graph
:输入工程当前所有的依赖。
直接在上面那个工程目录执行go mod graph命令,如下所示:
$ go mod graph
modDemo github.com/hashicorp/golang-lru@v0.5.4
3. go mod download
: 使用此命令来下载指定的模块到本地。
go module所管理的一些依赖库文件依然存放在GOPATH下面,download所下载的依赖储存在 $GOPATH/src/mod
中,而缓存路径是 $GOPATH/pkg/mod/cache 。
我们执行 go mod download之后,查看工程所依赖的库hashicorp就位于mod目录下面,如下
$ ls /Users/songguojun/go/pkg/mod/github.com/ !burnt!sushi fatih godoctor josharian mattn ramya-rao-a spf13 acroca gin-contrib golang json-iterator mdempsky rogpeppe stamblerre cosiner gin-gonic hashicorp karrick modern-go sergi ugorji cweill go-delve haya14busa keegancsmith peterh sirupsen uudashr davidrjenni go-playground inconshreveable leodido pkg skratchdot willf
这样使用go mod download命令就可以将工程项目的依赖下载下来。
4. go mod tidy & go mod verify & go mod why:
go mod tidy
:就是把不需要的依赖给删除掉。
go mod verify
:验证mod里依赖是否正确,同时也会验证go源代码其它依赖的内容。
go mod why
:可以展示及指定依赖关系。比如代码中有个依赖包,但是并不知道这个包的依赖关系,这时候就可以使用这个命令查看。
1)先看第一个命令go mod tidy
,我们将代码里下图这部分注释掉,就相当于没有使用依赖。
然后查看go.mod里依赖使用内容,确认依赖存在。
我们开始执行go mod tidy命令,执行完后,go.mod里的依赖项已尽被删除了。
2)再来使用go mod verify
我们将上面的go.mod文件复原,并修改其中的依赖版本号,将这个版本号修改为一个不存在的版本号。
当执行go mod verify
命令后就会提示错误,说明可以对依赖的版本进行校验。
如果依赖没有问题就提示通过。
如果依赖的源代码被修改了,go mod verify
命令也会有提示的。
3)go mod why
命令
执行go mod why
命令,参数m后面跟上依赖路径,就是显示依赖所在的工程项目。
5. go mod vendor
命令
主要讲工程里所有的依赖全部放入到工程项目根目录下vendor目录下,这个其实和php中composer包管理很像。这样使用vendor后,可以将依赖和gopath全部独立开来。
执行go mod vendor
命令后,就会在当前目录生成一个vendor目录,该文件夹下将会放置你go.mod
文件描述的依赖包,和上面说的gopath路径下mod目录一样,同时文件夹下同时还有一个文件modules.txt
,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先删除。