查看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目錄,應該先刪除。

