首頁 >常見問題 >淺談Go套件依賴管理工具govendor

淺談Go套件依賴管理工具govendor

little bottle
little bottle轉載
2019-04-29 13:45:283797瀏覽
govendor 是基於 vendor 機制實作的 Go 套件依賴管理命令列工具。與原生 vendor 無侵入性融合,也支援從其他依賴管理工具遷移,可以很方便的實現同一個套件在不同專案中不同版本、以及無相互侵入的開發和管理。

vendor 特性

在開始的時候,Go 並沒有提供較為妥當的套件管理工具。從 1.5 版本開始提供了 vendor 特性,但需要手動設定環境變數 GO15VENDOREXPERIMENT=1

在執行go buildgo run 指令時,會依照下列順序去尋找套件:

  • 目前套件下的vendor目錄
  • 向上級目錄查找,直到找到src 下的vendor 目錄
  • 在GOROOT 目錄下查找
  • 在GOPATH 下面查找依賴套件

#在發布1.6 版本時,該環境變數的值已經預設為1 了,該值可以使用go env 指令查看。

在發布 1.7 版本時,已去掉該環境變量,預設為開啟 vendor 特性。

vendor 使用建議

  • 一個函式庫工程(不包含mainpackage)不應該在自己的版本控制中儲存外部的套件在vendor 目錄中,除非有特殊原因並且知道為什麼要這麼做。
  • 在一個應用程式中,(包含mainpackage),建議只有一個vendor 目錄,且在程式碼庫一級目錄。

    相關教學:go影片教學

govendor 簡介

govendor 是基於vendor 目錄機制的套件管理工具。

  • 支援從專案原始碼中分析出依賴的包,並從$GOPATH 複製到專案的vendor 目錄下
  • 支持套件的指定版本,並以vendor/vendor.json 進行套件和版本管理,這點與PHP 的Composer 類似
  • 支援用govendor add/ update 指令從$GOPATH 複製依賴套件
  • 如果忽略了vendor/*/ 文件,可用govendor sync 復原依賴套件
  • 可直接用govendor fetch 新增或更新依賴套件
  • #可用govendor migrate 從其他vendor 套件管理工具中一鍵遷移到govendor
  • 支援Linux,macOS,Windows,甚至現有所有作業系統
  • 支援Git、Hg、SVN,BZR(必須指定路徑)

govendor 使用

要求:

  • #專案必須在$GOPATH/src 目錄下
  • #如果Go 版本為1.5,則必須手動設定環境變數set GO15VENDOREXPERIMENT=1

安裝

go get -u github.com/kardianos/govendor

為了方便快速使用govendor ,建議將$GOPATH/bin 加入PATH 中。 Linux/macOS 如下設定:

export PATH="$GOPATH/bin:$PATH"

初始化

在專案根目錄下執行下列指令進行vendor 初始化:

govendor init

專案根目錄下即會自動產生vendor 目錄和vendor.json 檔案。此時vendor.json 檔案內容為:

{
    "comment": "",
    "ignore": "test",
    "package": [],
    "rootPath": "govendor-example"
}

常用指令

  • 將已被引用且在$GOPATH 下的所有套件複製到vendor 目錄
govendor add +external
  • 僅從$GOPATH 複製指定套件
govendor add gopkg.in/yaml.v2
  • #列出程式碼中所有被引用到的套件及其狀態
govendor list
 e  github.com/gin-contrib/sse
 e  github.com/gin-gonic/gin
 e  github.com/gin-gonic/gin/binding
 e  github.com/gin-gonic/gin/internal/json
 e  github.com/gin-gonic/gin/render
 e  github.com/golang/protobuf/proto
 e  github.com/mattn/go-isatty
 e  github.com/ugorji/go/codec
 e  gopkg.in/go-playground/validator.v8
 e  gopkg.in/yaml.v2
pl  govendor-example
  m github.com/json-iterator/go
  m golang.org/x/sys/unix
  • 列出一個套件被哪些套件引用
govendor list -v fmt
 s  fmt
    ├──  e  github.com/gin-contrib/sse
    ├──  e  github.com/gin-gonic/gin
    ├──  e  github.com/gin-gonic/gin/render
    ├──  e  github.com/golang/protobuf/proto
    ├──  e  github.com/ugorji/go/codec
    ├──  e  gopkg.in/go-playground/validator.v8
    ├──  e  gopkg.in/yaml.v2
    └── pl  govendor-example
  • 從遠端倉庫新增或更新某個套件(不會$GOPATH 也存一份)
govendor fetch golang.org/x/net/context
    ##安裝指定版本的套件
  • govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55
    govendor fetch golang.org/x/net/context@v1   # Get latest v1.*.* tag or branch.
    govendor fetch golang.org/x/net/context@=v1  # Get the tag or branch named "v1".
    只格式化專案自身程式碼(
  • vendor 目錄下的不變動)
  • govendor fmt +local
    只建構編譯專案內部的套件
  • govendor install +local
    只測試專案內部的測試案例
  • govendor test +local
    建構所有
  • vendor 套件
  • #
    govendor install +vendor,^program
    拉取所有依賴的套件到
  • vendor 目錄(包括$GOPATH 存在或不存在的套件)
  • govendor fetch +out
    套件已在
  • vendor 目錄,但想從$GOPATH 更新
  • govendor update +vendor
##已修改了
    $GOPATH
  • #裡的某個包,現在想將已修改且未提交的包更新到vendor
    govendor update -uncommitted <updated-package-import-path>
Fork 了某個包,但尚未合併,該如何引用到最新的程式碼包
  • govendor fetch github.com/normal/pkg::github.com/myfork/pkg
  • 此時將從
myfork

拉取程式碼,而不是normal

    vendor.json
  • 中記錄了依賴包信息,該如何拉取更新
    govendor sync
  • govendor 子命令

各子命令詳細用法可透過

govendor COMMAND -h

或閱讀github.com/kardianos/govendor/context 查看原始碼套件如何實現的。 <table> <thead><tr class="firstRow"> <th align="center">子指令</th> <th>功能</th> </tr></thead> <tbody> <tr> <td align="center">#init</td>## 建立<td> vendor<code> 目錄和vendor.json 檔案 #list列出&過濾依賴包及其狀態 add從$GOPATH 複製套件到專案vendor 目錄 ##update #從$GOPATH 更新依賴套件到專案vendor 目錄 #remove 從vendor 目錄移除依賴的套件 status 列出所有缺失、過期和修改過的套件 ## fetch 從遠端倉庫新增或更新套件到專案vendor 目錄(不會儲存到$GOPATH) sync 根據vendor.json 拉取相符的套件到vendor 目錄##migrate #從其他基於vendor 實作的套件管理工具中一鍵遷移 #get 與go get 類似,將套件下載到$GOPATH,再將依賴套件複製到vendor 目錄license 列出所有依賴套件的LICENSE shell 可一次執行多個govendor 指令 govendor 狀態參數

狀態縮寫lGOPATH 中、卻不在項目vendor## vendor #已在 目錄下的套件 stds標準庫裡的套件 excludedx#明確被排除的外部套件 unusedu#未使用的套件,即在m programp主程式包,即可編譯為執行檔的套件
意義
local
本地包,即專案內部所寫的套件 externale外部包,即在
目錄 ##v
vendor
vendor
目錄下,但專案中並未引用到
missing
被引用了但卻找不到的套件

outside#相當於狀態為 external missing

all

###所有套件################支援狀態參數的子指令有:###list## #、###add###、###update###、###remove###、###fetch#########Go modules######普大喜奔的是,從Go 1.11 版本開始,官方已內建了更為強大的Go modules 來一統多年來Go 包依賴管理混亂的局面(Go 官方之前推出的dep 工具也幾乎胎死腹中),並且將在1.13版本中正式預設開啟。 ######目前已受到社群的看好和強烈推薦,建議新專案採用 Go modules。 ###

以上是淺談Go套件依賴管理工具govendor的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除
上一篇:bs架構是什麼下一篇:bs架構是什麼