Golang學習--包管理工具glide


上一篇文章中我們已經成功的運行了go的代碼,這是我們邁出的最基礎的一步。

一個項目通常會依賴很多外部的庫,當依賴的庫比較多的時候,手工管理就會比較麻煩,這個時候就需要包管理工具出場了,幫你管理好所有依賴的庫。

php項目中使用composer,javascript項目中使用npm,那么在go項目中,我們需要使用什么?

包依賴工具的選擇

當前go的包管理工具有glidegodepgovendorgvt等,相關對比的文章可以查看《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,有以下兩點原因:

  1. 我們需要支持VCS,dep暫時不支持
  2. 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-action/tree/master/ch2

參考摘錄文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM