govendor
是 go
的一個比較好用包版本管理工具。主要用來保證 go
項目在協同開發或發版部署時,保證部署安裝的依賴包版本對當前項目是穩定可用的。php
java
的 maven
,php
的 composer
,nodejs
的 npm
,python
的 requirement.txt
,golang
的 govendor
。java
例1:你的項目依賴一個github.com/foo 1.0.0
的包,若是不使用包版本管理工具,他人在本地部署安裝你的項目時,安裝的包版本多是最新的github.com/foo 2.0.0
,若是兩個版本存在兼容問題,就會出現crashed
。
例2:使用go get
安裝的項目依賴包的存放位置爲$GOPATH/src
,即與你的項目路徑同級,咱們使用git
時就沒辦法管理這些依賴包,不能也不該該將它們也提交到git
倉庫,若是提供一個包版本說明說,將說明書提交倉庫,他人則根據此說明書安裝依賴包。
爲解決此問題,govendor
出現了,govendor
會將項目依賴的包版本記錄到your_proj/vendor/vendor.json
中,後期將此文件提交至 git
倉庫,則其餘人 pull or clone
你的項目到本地後,便可使用 govendor
安裝穩定的包依賴。node
首先要部署好你的 go
環境,並將 $GOPATH/bin
路徑加載到系統PATH
中。咱們將體驗一遍如何使用govendor
管理你的項目包版本,及如何安裝他人的govendor
管理的go
項目(這點纔是精華,不少博文都不說起,爲何版本管理,不就是爲了能讓程序在其餘地方也能穩定運行嘛)。python
go get -u -v github.com/kardianos/govendor #運行 govendor 檢測安裝結果 govendor
若是能看到幫助提示信息,說明安裝ok。mysql
使用 govendor
初始化你的項目,將會在工程目錄下自動建立 vendor
目錄及 vendor/vendor.json
文件。若是是已有項目,也不要緊,govendor
容許你在項目開發的任何階段去使用它,它總能將你的項目包版本管理起來。git
mkdir go_proj && cd go_proj # init proj govendor init #查看目錄結構 tree . └── vendor └── vendor.json 1 directory, 1 file
govendor get
咱們仍然能夠經過 go get
安裝包到 $GOPATH/src
下,但使用govendor get
能夠在安裝包的同時將包歸入版本管理,並且會將包安裝在$GOPATH/src/your_proj/vendor
,更符合咱們的要求。github
#安裝在 $GOPATH/src 下 go get github.com/go-sql-driver/mysql #安裝在$GOPATH/src/your_proj/vendor下 govendor get github.com/go-sql-driver/mysql
govendor list & govendor add
govendor list
能夠幫助咱們查看項目中引入的包的狀態,即哪些是沒有歸入版本管理的外部包,哪些是歸入版本管理的包,哪些是標準包,哪些是本地包等。golang
govendor list Status Types +local (l) packages in your project 你本身在項目中定義的包 +external (e) referenced packages in GOPATH but not in current project 使用 go get 安裝的項目外部包 +vendor (v) packages in the vendor folder 使用 govendor get 安裝的歸入版本管理的包 +std (s) packages in the standard library 標準包 fmt/time/runtime 等 +excluded (x) external packages explicitly excluded from vendoring 排除的外部包 +unused (u) packages in the vendor folder, but unused 安裝但沒引用的包 +missing (m) referenced packages but not found 引用但沒安裝的包 缺失了 +program (p) package is a main package 你的項目主包,它總會同 l 一塊兒出現 pl 這個很好理解吧 +outside +external +missing +all +all packages
govendor add
則是方便咱們在任什麼時候間將項目包歸入版本管理。好比咱們前期一直使用或如今偶然使用go get
安裝了一個項目的依賴包,此包是不會被記錄在vendor/vendor.json
中的,即沒有歸入版本管理,那該如何將其歸入呢?sql
govendor add +external
執行上方命令便可,這樣項目依賴的包都歸入了版本管理。npm
在提交源碼至git
倉庫時,咱們沒有必要將依賴包源文件也一併提交至倉庫,因此 .gitignore
的編排要加上以下規則:
# vi .gitignore vendor/* !vendor/vendor.json
即排除vendor
下的除vendor/vendor.json
外的全部文件(這些文件其實就是依賴包),將vendor/vendor.json
提交至git
倉庫便可。
當咱們從git
倉庫下載好govendor
管理的golang
項目時,須要安裝好項目的包依賴,才能夠正常的運行程序,相似 composer install
的做用,這裏則是使用govendor sync
。
這裏使用個人一個 govendor
管理的基於Gin
的MVC
簡易框架給你們演示一下:
cd $GOPATH/src && git clone git@github.com:sqrtcat/easy-gin.git && cd easy-gin govendor sync
運行程序便可,簡單!