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