Golang 官方並無推薦最佳的包管理方案。到了1.5版本時代,官方引入包管理的設計,加了 vendor 目錄來支持本地包管理依賴。官方 wiki 推薦了多種支持這種特性的包管理工具,如:Godep、gv、gvt、glide、govendor等。git
下面簡要介紹一個我在項目中用到的 -- govendor。
該工具將項目依賴的外部包拷貝到項目下的 vendor 目錄下,並經過 vendor.json 文件來記錄依賴包的版本,方便用戶使用相對穩定的依賴。
對於 govendor 來講,依賴包主要有如下多種類型:github
狀態 | 縮寫狀態 | 含義 |
---|---|---|
+local | l | 本地包,即項目自身的包組織 |
+external | e | 外部包,即被 $GOPATH 管理,但不在 vendor 目錄下 |
+vendor | v | 已被 govendor 管理,即在 vendor 目錄下 |
+std | s | 標準庫中的包 |
+unused | u | 未使用的包,即包在 vendor 目錄下,但項目並無用到 |
+missing | m | 代碼引用了依賴包,但該包並無找到 |
+program | p | 主程序包,意味着能夠編譯爲執行文件 |
+outside | 外部包和缺失的包 | |
+all | 全部的包 |
go get -u github.com/kardianos/govendor
命令行執行 govendor
,若出現如下信息,則說明安裝成功。golang
➜ ~ govendor govendor (v1.0.8): record dependencies and copy into vendor folder -govendor-licenses Show govendor's licenses. -version Show govendor version ... ...
Warning: 須要把 $GOPATH/bin/
加到 PATH
中。shell
# Setup your project. cd "my project in GOPATH" # 初始化 vendor 目錄, project 下出現 vendor 目錄 govendor init # Add existing GOPATH files to vendor. govendor add +external # View your work. govendor list # Look at what is using a package govendor list -v fmt # Specify a specific version or revision to fetch govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55 # Get latest v1.*.* tag or branch. govendor fetch golang.org/x/net/context@v1 # Get the tag or branch named "v1". govendor fetch golang.org/x/net/context@=v1 # Update a package to latest, given any prior version constraint govendor fetch golang.org/x/net/context # Format your repository only govendor fmt +local # Build everything in your repository only govendor install +local # Test your repository only govendor test +local
init 建立 vendor 文件夾和 vendor.json 文件 list 列出已經存在的依賴包 add 從 $GOPATH 中添加依賴包,會加到 vendor.json update 從 $GOPATH 升級依賴包 remove 從 vendor 文件夾刪除依賴 status 列出本地丟失的、過時的和修改的package fetch 從遠端庫增長新的,或者更新 vendor 文件中的依賴包 sync Pull packages into vendor folder from remote repository with revisions migrate Move packages from a legacy tool to the vendor folder with metadata. get 相似 go get,可是會把依賴包拷貝到 vendor 目錄 license List discovered licenses for the given status or import paths. shell Run a "shell" to make multiple sub-commands more efficient for large projects. go tool commands that are wrapped: `+<status>` package selection may be used with them fmt, build, install, clean, test, vet, generate, tool
warningjson
The project must be within a $GOPATH/src
.app
If using go1.5, ensure you set GO15VENDOREXPERIMENT=1
.ide