govendor 是基於 vendor
機制實作的 Go 套件依賴管理命令列工具。與原生 vendor 無侵入性融合,也支援從其他依賴管理工具遷移,可以很方便的實現同一個套件在不同專案中不同版本、以及無相互侵入的開發和管理。
在開始的時候,Go 並沒有提供較為妥當的套件管理工具。從 1.5 版本開始提供了 vendor 特性,但需要手動設定環境變數 GO15VENDOREXPERIMENT=1
。
在執行go build
或go run
指令時,會依照下列順序去尋找套件:
#在發布1.6 版本時,該環境變數的值已經預設為1 了,該值可以使用go env
指令查看。
在發布 1.7 版本時,已去掉該環境變量,預設為開啟 vendor
特性。
main
的package
)不應該在自己的版本控制中儲存外部的套件在vendor
目錄中,除非有特殊原因並且知道為什麼要這麼做。 在一個應用程式中,(包含main
的package
),建議只有一個vendor
目錄,且在程式碼庫一級目錄。
相關教學:go影片教學
govendor 是基於vendor
目錄機制的套件管理工具。
$GOPATH
複製到專案的vendor
目錄下vendor/vendor.json
進行套件和版本管理,這點與PHP 的Composer
類似govendor add/ update
指令從$GOPATH
複製依賴套件vendor/*/
文件,可用govendor sync
復原依賴套件govendor fetch
新增或更新依賴套件govendor migrate
從其他vendor
套件管理工具中一鍵遷移到govendor
要求:
$GOPATH/src
目錄下set GO15VENDOREXPERIMENT=1
go get -u github.com/kardianos/govendor
為了方便快速使用govendor
,建議將$GOPATH/bin
加入PATH 中。 Linux/macOS 如下設定:
export PATH="$GOPATH/bin:$PATH"
在專案根目錄下執行下列指令進行vendor
初始化:
govendor init
專案根目錄下即會自動產生vendor
目錄和vendor.json
檔案。此時vendor.json
檔案內容為:
{ "comment": "", "ignore": "test", "package": [], "rootPath": "govendor-example" }
$GOPATH
下的所有套件複製到vendor
目錄govendor add +external
$GOPATH
複製指定套件govendor add gopkg.in/yaml.v2
govendor list
e github.com/gin-contrib/sse e github.com/gin-gonic/gin e github.com/gin-gonic/gin/binding e github.com/gin-gonic/gin/internal/json e github.com/gin-gonic/gin/render e github.com/golang/protobuf/proto e github.com/mattn/go-isatty e github.com/ugorji/go/codec e gopkg.in/go-playground/validator.v8 e gopkg.in/yaml.v2 pl govendor-example m github.com/json-iterator/go m golang.org/x/sys/unix
govendor list -v fmt
s fmt ├── e github.com/gin-contrib/sse ├── e github.com/gin-gonic/gin ├── e github.com/gin-gonic/gin/render ├── e github.com/golang/protobuf/proto ├── e github.com/ugorji/go/codec ├── e gopkg.in/go-playground/validator.v8 ├── e gopkg.in/yaml.v2 └── pl govendor-example
$GOPATH
也存一份)govendor fetch golang.org/x/net/context
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 fmt +local
govendor install +local
govendor test +local
套件
govendor install +vendor,^program
目錄(包括
$GOPATH 存在或不存在的套件)
govendor fetch +out
目錄,但想從
$GOPATH 更新
govendor update +vendor
vendor
govendor update -uncommitted <updated-package-import-path>
govendor fetch github.com/normal/pkg::github.com/myfork/pkg
拉取程式碼,而不是normal
。
govendor sync
或閱讀github.com/kardianos/govendor/context
查看原始碼套件如何實現的。 <table>
<thead><tr class="firstRow">
<th align="center">子指令</th>
<th>功能</th>
</tr></thead>
<tbody>
<tr>
<td align="center">#init</td>## 建立<td> vendor<code> 目錄和
vendor.json 檔案
複製套件到專案
vendor 目錄
vendor
目錄
)
目錄
##migrate
#getvendor
目錄
license
意義 | ||
---|---|---|
local | ||
本地包,即專案內部所寫的套件 | external e 外部包,即在 | GOPATH|
目錄 | ## vendor | ##v
|
#已在 | vendor | 目錄下的套件
| std
標準庫裡的套件 | excluded | |
#明確被排除的外部套件 | unused | |
#未使用的套件,即在 | vendor 目錄下,但專案中並未引用到 |
missing |
被引用了但卻找不到的套件 | p |
outside
#相當於狀態為
external missing
以上是淺談Go套件依賴管理工具govendor的詳細內容。更多資訊請關注PHP中文網其他相關文章!