上一篇文章中我們已經成功的運行了go的代碼,這是我們邁出的最基礎的一步。 一個項目通常會依賴很多外部的庫,當依賴的庫比較多的時候,手工管理就會比較麻煩,這個時候就需要包管理工具出場了,幫你管理好所有依賴的庫。 php項目中使用composer,javascript項目中使用npm,那麼在go項目中, ...
上一篇文章中我們已經成功的運行了go的代碼,這是我們邁出的最基礎的一步。
一個項目通常會依賴很多外部的庫,當依賴的庫比較多的時候,手工管理就會比較麻煩,這個時候就需要包管理工具出場了,幫你管理好所有依賴的庫。
php項目中使用composer,javascript項目中使用npm,那麼在go項目中,我們需要使用什麼?
包依賴工具的選擇
當前go的包管理工具有glide、godep、govendor和gvt等,相關對比的文章可以查看《go依賴包管理工具對比》。
功能對比可以參考如下內容(雖然跟上面文章比較的工具有些不同),內容來自《Go Package Manager Comparison》
Glide | GB | Godep | Govendor | |
---|---|---|---|---|
Semantic Versions | ✓ | ✓ | ✕ | ✓ |
Semantic Version Ranges | ✓ | ✕ | ✕ | ✕ |
Resolves dependency trees including versions | ✓ | ✕ | ✕ | ✕ |
Uses common range syntax (similar to PHP, JavaScript, etc) | ✓ | ✕ | ✕ | ✕ |
Tries to import from other package managers | ✓ | ✕ | ✕ | ✕ |
Copies from the GOPATH | ✕* | ✕ | ✓ | ✓ |
Works with the go toolchain | ✓ | ✕ | ✓ | ✓ |
Locks for reproducible builds | ✓ | ✓ | ✓ | ✓ |
Allows package/version checked into VCS or installed on demand | ✓ | ✓ | ✕ | ✓ |
Aliased repos (e.g., using forks) | ✓ | ✕ | ✕ | ✓ |
Plugin extensibility model | ✓ | ✓ | ✕ | ✕ |
Supports deleting unused repos for cleanup (opt-in) | ✓ | ✕ | ✕ | ✓ |
根據我們的需求和瞭解,選擇了使用glide,當然大家也可以選擇其他包管理工具。
glide命令
我們來熟悉一下glide的命令
# 初始化glide配置
glide create
glide init
# 添加新的包
glide get [package name]
# 根據glide.yaml更新包
glide update
glide up
# 根據glide.yaml安裝包
glide install
# 返回當前項目的名稱
glide name
# 列出當前項目已安裝的包
glide list
# 替換包的鏡像
glide mirror set [original] [replacement]
glide mirror set [original] [replacement] --vcs [type]
# 移除包的鏡像
glide mirror remove [original]
# 獲取包的鏡像列表
glide mirror list
glide mirror特別適用於不能訪問一些站點,導致很Golang的依賴包不能通過go get下載的情況。可以通過配置將牆了的版本庫 URL 映射到沒被牆的 URL,甚至也可以映射到本地版本庫。
掌握上面的命令就可以使用glide了,是不是很簡單?
glide.yaml解析
我們再來看一一個完整的glide.yaml的內容
package: github.com/Masterminds/glide
homepage: https://masterminds.github.io/glide
license: MIT
owners:
- name: Matt Butcher
email: [email protected]
homepage: http://technosophos.com
- name: Matt Farina
email: [email protected]
homepage: https://www.mattfarina.com
ignore:
- appengine
excludeDirs:
- node_modules
import:
- package: gopkg.in/yaml.v2
- package: github.com/Masterminds/vcs
version: ^1.2.0
repo: [email protected]:Masterminds/vcs
vcs: git
- package: github.com/codegangsta/cli
version: f89effe81c1ece9c5b0fda359ebd9cf65f169a51
- package: github.com/Masterminds/semver
version: ^1.0.0
# 測試導入包
testImport:
- package: github.com/arschles/assert
glide.yaml中的這些元素的解釋如下:
package
:頂部的 package 是它所在GOPATH的位置,glide 將從該位置下開始導包。homepage
:該項目的詳情頁面。license
:許可證標識,可以是SPDX license字元串或文件路徑。owners
:項目的所有者信息,便於接受漏洞信息。ignore
:忽略導入的包,註意是包而不是目錄。excludeDirs
:排除掃描依賴的目錄。import
:import 的包列表:package
:導入包的名稱,必填。軟體包名稱遵循go工具所用的相同模式。這意味著:1、映射到VCS遠程位置的軟體包名稱以.git,.bzr,.hg或.svn結尾。 例如,example.com/foo/pkg.git/subpkg。2、GitHub, BitBucket, Launchpad, IBM Bluemix Services, and Go on Google Source是特殊情況,不需要 VCS 擴展。version
:可以為semantic version, semantic version range, branch, tag 或者 commit id。repo
:如果包名稱不是repo位置或這是一個私人存儲庫,它可以去這裡。 該軟體包將從repo簽出並放在軟體包名稱指定的位置。 這允許使用fork。vcs
:要使用的VCS,如git,hg,bzr或svn。僅當無法從名稱中檢測到類型時才需要。例如,以.git或GitHub結尾的倉庫可以被檢測為Git。 對於Bitbucket的repo,我們可以聯繫API來發現類型。subpackages
:在存儲庫中使用的包的記錄。這不包括存儲庫中的所有包,而是包括正在使用的包。os
:用於過濾的操作系統的列表。如果設置它將比較當前運行時操作系統與指定的操作系統,並且只有獲取匹配的依賴。如果未設置過濾,則跳過。這些名稱與構建標誌和GOOS環境變數中使用的名稱相同。arch
:用於過濾的體繫結構列表。如果設置它將比較當前運行時架構與指定的架構,並且只有在匹配時獲取依賴關係。如果未設置過濾,則跳過。名稱與構建標誌和GOARCH環境變數中使用的名稱相同。
testImport
:在導入中未列出的測試中使用的軟體包列表。每個包具有與導入下列出的相同的詳細信息。
glide版本號指定規則如下:
=: equal (aliased to no operator)
!=: not equal
>: greater than
<: less than
>=: greater than or equal to
<=: less than or equal to
1.2 - 1.4.5 which is equivalent to >= 1.2, <= 1.4.5
2.3.4 - 4.5 which is equivalent to >= 2.3.4, <= 4.5
1.2.x is equivalent to >= 1.2.0, < 1.3.0
>= 1.2.x is equivalent to >= 1.2.0
<= 2.x is equivalent to < 3
* is equivalent to >= 0.0.0
~1.2.3 is equivalent to >= 1.2.3, < 1.3.0
~1 is equivalent to >= 1, < 2
~2.3 is equivalent to >= 2.3, < 2.4
~1.2.x is equivalent to >= 1.2.0, < 1.3.0
~1.x is equivalent to >= 1, < 2
^1.2.3 is equivalent to >= 1.2.3, < 2.0.0
^1.2.x is equivalent to >= 1.2.0, < 2.0.0
^2.3 is equivalent to >= 2.3, < 3
^2.x is equivalent to >= 2.0.0, < 3
要註意的是安裝完成之後,會生成glide.lock文件,鎖定安裝包的版本。