最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go外部依賴包從vendor,$GOPATH和$GOPATH/pkg/mod查找順序

 更新時間:2020年12月18日 09:42:06   作者:benben_2015  
這篇文章主要介紹了Go外部依賴包vendor,$GOPATH和$GOPATH/pkg/mod下查找順序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

vendor

vendor概念最早是由Keith提出,用來存放依賴包。在版本1.5出現(xiàn)。例如gb項目提供了一個名為gsftp的示例項目,它有一個gsftp程序,在標(biāo)準(zhǔn)庫之外有三個依賴項。golang.org/x/crypto/ssh, golang.org/x/crypto/ssh/agent和github.com/pkg/sftp。

按vendor概念調(diào)整的目錄結(jié)構(gòu)如下:

$GOPATH
|	src/
|	|	github.com/constabulary/example-gsftp/
|	|	|	cmd/
|	|	|	|	gsftp/
|	|	|	|	|	main.go
|	|	|	vendor/
|	|	|	|	github.com/pkg/sftp/
|	|	|	|	golang.org/x/crypto/ssh/
|	|	|	|	|	agent/

文件github.com/constabulary/example-gsftp/cmd/gsftp/main.go的引用如下所示,看起來和平時的引用沒什么區(qū)別。

import (
 ...
 "golang.org/x/crypto/ssh"
 "golang.org/x/crypto/ssh/agent"
 "github.com/pkg/sftp"
)

因為github.com/constabulary/example-gsftp/vendor/golang.org/x/crypto/ssh存在,且正在編譯的文件位于以github.com/constabulary/example-gsftp為根的子樹中。則導(dǎo)入語句import "golang.org/x/crypto/ssh",編譯好像是import "github.com/constabulary/example-gsftp/vendor/golang.org/x/crypto/ssh",只不過這種較長的形式從未寫過。

因此github.com/constabulary/example-gsftp中的源代碼取決于vendor中有關(guān)golang.org/x/crypto/ssh的拷貝副本, 而不是$GOPATH中的其他地方。

vendor的層級搜索

規(guī)則是:

從引用文件所在的vendor路徑下面搜索,

如果沒有找到,那么從上層目錄的vendor路徑下面搜索,

直到src的vendor路徑下面搜索。

modules

Go 1.11版本支持臨時環(huán)境變量GO111MODULE,通過該環(huán)境變量來控制依賴包的管理方式。當(dāng)GO111MODULE的值為on時,那么就會使用modules功能,這種模式下,$GOPATH不再作為build時導(dǎo)入的角色,依賴包會存放在$GOPATH/pkg/mod目錄下。工程中的依賴包也會從此目錄下查找。

有關(guān)該功能的介紹,可以看Go1.1.1新功能module的介紹及使用。

查找順序

GO111MODULE=off時,如果一個包在vendor和$GOPATH下都存在,那么使用順序為:

優(yōu)先使用vendor目錄下面的包,

如果vendor下面沒有搜索到,再搜索$GOPATH/src下面的包,

如果$GOPATH下面沒有搜索到,那么搜索$GOROOT/src下面的包,

要么完整使用vendor下面的包,要么完整使用$GOPATH下面的包,不會混合使用。

補(bǔ)充:Go 語言編程 — go mod 依賴包管理

使用 go mod

go mod 的子指令

go mod 依賴包管理

Golang 將 Modules(模塊)定義為 “源代碼交付和版本控制的單元”。

go mod 是 Golang 1.11 版本引入的依賴包管理工具,替換舊的基于 GOPATH 的依賴包管理方式。GOPATH 不再需要包含 src 子目錄,使用 go.mod 方式管理的依賴包都被下載到了 $GOPATH/pkg/mod 目錄。

有了 go mod 之后,每個項目(源代碼目錄)就是一個 Module,只要其中包含了 go.mod 文件。go mod 指令和 go.mod 文件用于記錄和解析模塊之間的依賴性。

go.mod 文件一旦創(chuàng)建后,它的內(nèi)容將會被 go toolchain(工具鏈)完全掌控,比如:執(zhí)行 go get、go build、go mod 等指令時,會自動修改和維護(hù) go.mod 文件。

除了 go.mod 之外,go 指令還維護(hù)了一個 go.sum 文件,其中包含特定模塊版本內(nèi)容的加密哈希。go 指令使用 go.sum 文件來確保這些模塊的哈希值,以確保項目所依賴的模塊不會出現(xiàn)意外更改。

go.mod 和 go.sum 都應(yīng)該應(yīng)用于版本控制。 并且 go.sum 不需要手工維護(hù),所以可以不用太關(guān)注。

使用 go mod

使用 Go Modules 需要配置 GO111MODULE 環(huán)境變量,GO111MODULE 有三個值:off、on 和 auto(默認(rèn)值):

GO111MODULE=off:關(guān)閉 Go Modules,沿用舊版本的 GOPATH 方式,項目的依賴包依舊在 vendor 目錄或者 $GOPATH/src 目錄下進(jìn)行查找。

GO111MODULE=on:開啟 Go Modules,項目的依賴包記錄在 go.mod 文件中。

GO111MODULE=auto:go 指令根據(jù)當(dāng)前目錄來決定是否啟用 Modules 功能。

當(dāng)項目處于 GOPATH/src 內(nèi),則會使用 GOPATH/src 的依賴包。

當(dāng)項目處于 GOPATH/src 外,則使用 go.mod 里 require 聲明的依賴包。

使用 go.mod 的流程:

在 $GOPATH/src 目錄之外創(chuàng)建 Golang 項目。

初始化項目的 go.mod 文件。

$ go mod init <projectNmae>

注意,項目下屬的子目錄是不需要再次 init 的,整個項目的依賴都會組織在根目錄的 go.mod 文件里。

導(dǎo)入外部包:

package main

import (
 "fmt"
 "github.com/gohouse/gorose"
)

func main() {
 fmt.Println("hello world!")
}

運行程序時,會自動下載依賴包并更新 go.mod 文件:

$ go run hello.go
go: finding module for package github.com/gohouse/gorose
go: downloading github.com/gohouse/gorose v1.0.5
go: found github.com/gohouse/gorose in github.com/gohouse/gorose v1.0.5
go: finding module for package github.com/gohouse/converter
go: downloading github.com/BurntSushi/toml v0.3.0
go: downloading github.com/gohouse/converter v0.0.3
go: found github.com/gohouse/converter in github.com/gohouse/converter v0.0.3
go: downloading github.com/go-sql-driver/mysql v1.4.0
# command-line-arguments
./hello.go:5:5: imported and not used: "github.com/gohouse/gorose"

檢查 go.mod 文件中自動更新的依賴清單:

module hello

go 1.14

require (
 github.com/gohouse/converter v0.0.3 // indirect
 github.com/gohouse/gorose v1.0.5 // indirect
)

其中 require 是一個關(guān)鍵字,此外還有 module、replace 和 exclude:

module 語句:指定模塊的名字(路徑)。

require 語句:指定的依賴模塊。

replace 語句:可以替換依賴項模塊。

exclude 語句:可以忽略依賴項模塊。

另外,上述的 v0.0.3 就是依賴包 converter 的版本。如果沒有在 go.mod 指定版本,go 指令就會自動下載代碼中的依賴的最新版本。否則,go 指令會根據(jù) require 語句的路徑和版本進(jìn)行下載。指定版本時也可以用 latest,表示下載最新的版本。

replace 語句常用于依賴包實際路徑變更的場景中,例如:

replace golang.org/x/text => github.com/golang/text latest

如此的,在這種情況下依賴包的維護(hù)會變得更簡單。

還需要注意 go.mod 中的 module hello 這一條語句,因為當(dāng)前項目已經(jīng)不在 $GOPATH/src 內(nèi)了,所以 module hello 標(biāo)注了項目 “根” 的路徑,以此來作為項目中其他包的根路徑。

go mod 的子指令

初始化一個 Module:

go mod init <project_name>

下載項目依賴的 modules 到本地 Cache:

# 在項目目錄下執(zhí)行

go mod download

注:目前所有模塊版本數(shù)據(jù)均緩存在 $GOPATH/pkg/mod 和 $GOPATH/pkg/sum 下。

編輯 go.mod 文件,選項有 -json、-require 和 -exclude:

go mod edit
# e.g.
go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest

以文本模式打印模塊需求圖:

go mod graph

刪除錯誤或者不使用的 Modules:

go mod tidy

生成 Vendor 目錄:

go mod vendor

驗證依賴是否正確:

go mod verify

查找依賴:

go mod why

清理 Modules 緩存:

go clean -modcache

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • golang?struct?json?tag的使用以及深入講解

    golang?struct?json?tag的使用以及深入講解

    這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • 淺析Go語言中數(shù)組的這些細(xì)節(jié)

    淺析Go語言中數(shù)組的這些細(xì)節(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語言中數(shù)組一些細(xì)節(jié)的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以了解一下
    2022-11-11
  • Go+Gin實現(xiàn)安全多文件上傳功能

    Go+Gin實現(xiàn)安全多文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Go如何利用Gin框架實現(xiàn)安全多文件上傳功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Go語言空白表示符_的實例用法

    Go語言空白表示符_的實例用法

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于Go語言空白表示符_的實例用法,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-07-07
  • Golang的循環(huán)中break和continue語句的用法講解

    Golang的循環(huán)中break和continue語句的用法講解

    這篇文章主要介紹了Golang的循環(huán)中break和continue語句的用法講解,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Golang語言中fs.ReadDir的全面指南

    Golang語言中fs.ReadDir的全面指南

    歡迎來到Golang語言中fs.ReadDir的全面指南!這個簡短的引導(dǎo)將讓你掌握如何高效地使用這個功能,一起來深入探索吧,保證你會有所收獲!
    2023-12-12
  • 如何通過go自定義一個分頁插件

    如何通過go自定義一個分頁插件

    分頁是我們?nèi)粘i_發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于如何通過go自定義一個分頁插件的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 如何在Go語言中靈活運用匿名函數(shù)和閉包

    如何在Go語言中靈活運用匿名函數(shù)和閉包

    這篇文章主要為大家介紹了如何在Go語言中靈活運用匿名函數(shù)和閉包實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語言設(shè)計實現(xiàn)在任務(wù)欄里提醒你喝水的兔子

    Go語言設(shè)計實現(xiàn)在任務(wù)欄里提醒你喝水的兔子

    這篇文章主要為大家介紹了Go語言設(shè)計實現(xiàn)在任務(wù)欄里提醒你喝水的兔子示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)

    Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)

    這篇文章主要介紹了Golang中使用Date進(jìn)行日期格式化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論

札达县| 南木林县| 昭苏县| 彰化县| 中牟县| 南阳市| 忻州市| 杭州市| 南宫市| 溧水县| 绥中县| 建平县| 张北县| 弥渡县| 金昌市| 夏邑县| 长宁区| 城市| 福海县| 卓资县| 屏东县| 彭州市| 芜湖市| 贺兰县| 大化| 玛沁县| 游戏| 马龙县| 延寿县| 柞水县| 岱山县| 海原县| 通辽市| 灵川县| 阜南县| 石棉县| 隆德县| 集安市| 漳州市| 襄城县| 武安市|