目錄
vendor 特性
vendor 使用建議
govendor 簡介
govendor 使用
安裝
初始化
常用指令
各子命令詳細用法可透過
首頁 常見問題 淺談Go套件依賴管理工具govendor

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

Apr 29, 2019 pm 01:45 PM
golang 套件管理

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用 Golang 安全地讀取和寫入檔案? 如何使用 Golang 安全地讀取和寫入檔案? Jun 06, 2024 pm 05:14 PM

在Go中安全地讀取和寫入檔案至關重要。指南包括:檢查檔案權限使用defer關閉檔案驗證檔案路徑使用上下文逾時遵循這些準則可確保資料的安全性和應用程式的健全性。

如何為 Golang 資料庫連線配置連線池? 如何為 Golang 資料庫連線配置連線池? Jun 06, 2024 am 11:21 AM

如何為Go資料庫連線配置連線池?使用database/sql包中的DB類型建立資料庫連線;設定MaxOpenConns以控制最大並發連線數;設定MaxIdleConns以設定最大空閒連線數;設定ConnMaxLifetime以控制連線的最大生命週期。

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

Golang框架與Go框架:內部架構與外部特性對比 Golang框架與Go框架:內部架構與外部特性對比 Jun 06, 2024 pm 12:37 PM

GoLang框架與Go框架的差異體現在內部架構與外部特性。 GoLang框架基於Go標準函式庫,擴充其功能,而Go框架由獨立函式庫組成,以實現特定目的。 GoLang框架更靈活,Go框架更容易上手。 GoLang框架在效能上稍有優勢,Go框架的可擴充性更高。案例:gin-gonic(Go框架)用於建立RESTAPI,而Echo(GoLang框架)用於建立Web應用程式。

從前端轉型後端開發,學習Java還是Golang更有前景? 從前端轉型後端開發,學習Java還是Golang更有前景? Apr 02, 2025 am 09:12 AM

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

如何找出 Golang 正規表示式符合的第一個子字串? 如何找出 Golang 正規表示式符合的第一個子字串? Jun 06, 2024 am 10:51 AM

FindStringSubmatch函數可找出正規表示式匹配的第一個子字串:此函數傳回包含匹配子字串的切片,第一個元素為整個匹配字串,後續元素為各個子字串。程式碼範例:regexp.FindStringSubmatch(text,pattern)傳回符合子字串的切片。實戰案例:可用於匹配電子郵件地址中的域名,例如:email:="user@example.com",pattern:=@([^\s]+)$獲取域名match[1]。

golang框架開發實戰教學:常見疑問解答 golang框架開發實戰教學:常見疑問解答 Jun 06, 2024 am 11:02 AM

Go框架開發常見問題:框架選擇:取決於應用需求和開發者偏好,如Gin(API)、Echo(可擴展)、Beego(ORM)、Iris(效能)。安裝和使用:使用gomod指令安裝,導入框架並使用。資料庫互動:使用ORM庫,如gorm,建立資料庫連線和操作。身份驗證和授權:使用會話管理和身份驗證中間件,如gin-contrib/sessions。實戰案例:使用Gin框架建立一個簡單的部落格API,提供POST、GET等功能。

如何用 Golang 使用預先定義時區? 如何用 Golang 使用預先定義時區? Jun 06, 2024 pm 01:02 PM

Go語言中使用預先定義時區包含下列步驟:匯入"time"套件。透過LoadLocation函數載入特定時區。在建立Time物件、解析時間字串等操作中使用已載入的時區,進行日期和時間轉換。使用不同時區的日期進行比較,以說明預先定義時區功能的應用。