文章來源:Golang學習--包管理工具glide
上一篇文章中我們已經成功的執行了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,當然大家也可以選擇其他包管理工具。
現在官方也出了包管理工具dep,感興趣的可以檢視這篇文章《官方依賴管理工具:dep》
為什麼我們不選擇dep,而使用glide,有以下兩點原因:
- 我們需要支援VCS,dep暫時不支援
- dep需要翻牆
當然如果這兩點對你來說不是問題的話,我也推薦大家使用dep
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: technosophos@gmail.com
homepage: http://technosophos.com
- name: Matt Farina
email: matt@mattfarina.com
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: git@github.com: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檔案,鎖定安裝包的版本。
程式碼可參考:https://github.com/CraryPrimitiveMan/go-in...
參考摘錄文章
本作品採用《CC 協議》,轉載必須註明作者和本文連結