摘自:html
http://blueskykong.com/2019/02/18/go-dep-1/git
https://www.cnblogs.com/apocelipes/p/10295096.html#vcs-semvergithub
GOROOT的目的就是告知go當前的安裝位置,默認go會安裝在/usr/local/go下,但也容許自定義安裝位置(經過 export GOROOT=$HOME/go1.9.3
指定)。編譯的時候從GOROOT去找SDK的system libarirygolang
GOPATH必需要設置,GOPATH告知go,須要代碼(包括本項目即內部依賴和引用外部項目的代碼即外部依賴)的時候去哪裏查找。GOPATH能夠隨着項目的不一樣而從新設置。chrome
GOPATH下會有3個目錄:src、bin、pkg。json
內部依賴管理緩存
$GOPATH/src/
目錄去查找須要的代碼GOPATH來管理外部依賴工具
go容許import不一樣代碼庫的代碼,例如github.com, k8s.io, golang.org等等;對於須要import的代碼,可使用 go get 命令取下來放到GOPATH對應的目錄中去。例如go get github.com/globalsign/mgo
(下載和建立項目要保持目錄一致,這樣才能保證可以正確的引用外部導入和內部導入),會下載到$GOPATH/src/github.com/globalsign/mgo
中去,當其餘項目在import github.com/globalsign/mgo
的時候也就能找到對應的代碼了。fetch
$GOPATH/src
之後,就能夠進去go build了(注意,必須將kube-keepalived-vip項目拷貝到$GOPATH/src
目錄中,不然go會無視vendor目錄,仍然去$GOPATH/src
中去找依賴包)。該工具將項目依賴的外部包拷貝到項目下的 vendor 目錄下,並經過 vendor.json 文件來記錄依賴包的版本,方便用戶使用相對穩定的依賴。ui
使用步驟
#安裝 go get -u github.com/kardianos/govendor # 進入項目的根目錄 # 建立 vendor 文件夾和 vendor.json 文件,此時文件中只有本項目的信息 govendor init # 拷貝GOPATH下的代碼到vendor目錄中,更新vendor.json govendor add +external # 列出已經存在的依賴包 govendor list # 找出使用的對應包 govendor list -v fmt # 拉取指定版本的包 govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55 govendor fetch golang.org/x/net/context@v1 # Get latest v1.*.* tag or branch. govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named "v1".
govendor還能夠直接指定依賴包版原本獲取包
go module 是go包的集合,是源代碼交換和版本化控制的基本單元
go.mod
文件的目錄,能夠存放於文件系統上的任何位置,而不用管 GOPATH
路徑究竟是什麼要使用go module
,首先要設置GO111MODULE=on
。
on
,那麼不管模塊在於何種路徑,都會啓用模塊支持,始終使用 module-aware mode,只根據 go.mod 下載 dependency 而徹底忽略 GOPATH 以及 vendor 目錄off
,禁用 go module 功能,go compiler 會始終使用 GOPATH mode,即不管要構建的源碼目錄是否在 GOPATH 路徑下,go compiler 都會在傳統的 GOPATH 和 vendor 目錄 (僅支持在 GOPATH 目錄下的 package) 下搜索目標程序依賴的 go package;auto
,知足如下任一條件時才使用 module-aware mode:
假設你已經有了一個go 項目, 好比在$GOPATH/github.com/smallnest/rpcx
下, 你可使用go mod init github.com/smallnest/rpcx
在這個文件夾下(即模塊根目錄)建立一個空的go.mod
(只有第一行 module github.com/smallnest/rpcx
即模塊導入名稱)。
下面是一個簡化的go.mod的內容
module my/thing //模塊名稱 require (//要求的依賴項列表以及版本 one/thing v1.3.2 other/thing v2.5.0 // indirect ... ) exclude (//排除的依賴項,僅在當前模塊爲主模塊時生效 bad/thing v0.7.3 ) replace (//替換的依賴項,僅在當前模塊爲主模塊時生效 src/thing 1.0.2 => dst/thing v1.1.0 )
go get ./...
查找依賴,並記錄在go.mod
文件中(你還能夠指定 -tags
,這樣能夠把tags的依賴都查找到)。
執行上面的命令會把go.mod
的latest
版本換成實際的最新的版本,而且會生成一個go.sum
記錄每一個依賴庫的版本和哈希值,用於驗證緩存的依賴項是否知足模塊要求
你能夠在GOPATH
以外建立新的項目。
go mod init packagename
能夠建立一個空的go.mod
,而後你能夠在其中增長require github.com/smallnest/rpcx latest
依賴,或者像上面同樣讓go自動發現和維護。
go mod download
能夠下載所須要的依賴,可是依賴並非下載到$GOPATH
中,而是$GOPATH/pkg/mod
中,用來當作緩存,多個項目能夠共享緩存的module。
//download 下載依賴的module到本地cache //edit edit go.mod from tools or scripts (編輯go.mod文件) 例如 go mod edit -require="github.com/chromedp/chromedp@v0.1.0",修改依賴關係使用chromedp 的v0.1.0版本 //tidy 增長丟失的module,去掉未用的module,如在項目的開發過程當中, 依賴有變動, 可以使用 go mod tidy 來應用這些變動到 go.mod 文件. //graph print module requirement graph (打印模塊依賴圖)) //init 在當前文件夾下初始化一個新的module, 建立go.mod文件 //vendor 在項目發佈時會要將依賴複製到項目中,會複製modules下載到vendor中, 貌似只會下載你代碼中引用的庫,而不是go.mod中定義所有的module。 //verify verify dependencies have expected content (校驗依賴) //why explain why packages or modules are needed (解釋爲何須要依賴) //go list -m -json all //依賴詳情
go module 功能被集成到 go
命令行工具中,例如,在調用諸如 go build
,go install
,go run
,go test
之類的命令時,將啓動相應的操做,如緩存,建立或更新 go.mod
和 go.sum
等
go get -u
將會升級到最新的次要版本或者修訂版本go get -u=patch
將會升級到最新的修訂版本go get package@version
將會升級到指定的版本號version
golang官方推薦的最佳實踐叫作semver
,寫全了就是Semantic Versioning
(語義化版本)。形如vX.Y.Z
的形式顯然比一串hash更直觀,x.y.z, z是修訂版本號, y是次要版本號,如此一來包的導入路徑發生了變化,不一樣的導入路徑意味着不一樣的包,更具體的規範在這裏。