当前位置:首页 > 文章列表 > Golang > Go教程 > Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序

Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序

来源:脚本之家 2022-12-29 10:12:36 0浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序》,涉及到mod、$GOPATH、查找,有需要的可以收藏一下

vendor

vendor概念最早是由Keith提出,用来存放依赖包。在版本1.5出现。例如gb项目提供了一个名为gsftp的示例项目,它有一个gsftp程序,在标准库之外有三个依赖项。golang.org/x/crypto/ssh, golang.org/x/crypto/ssh/agent和github.com/pkg/sftp。

按vendor概念调整的目录结构如下:

$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的引用如下所示,看起来和平时的引用没什么区别。

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为根的子树中。则导入语句import "golang.org/x/crypto/ssh",编译好像是import "github.com/constabulary/example-gsftp/vendor/golang.org/x/crypto/ssh",只不过这种较长的形式从未写过。

因此github.com/constabulary/example-gsftp中的源代码取决于vendor中有关golang.org/x/crypto/ssh的拷贝副本, 而不是$GOPATH中的其他地方。

vendor的层级搜索

规则是:

从引用文件所在的vendor路径下面搜索,

如果没有找到,那么从上层目录的vendor路径下面搜索,

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

modules

Go 1.11版本支持临时环境变量GO111MODULE,通过该环境变量来控制依赖包的管理方式。当GO111MODULE的值为on时,那么就会使用modules功能,这种模式下,$GOPATH不再作为build时导入的角色,依赖包会存放在$GOPATH/pkg/mod目录下。工程中的依赖包也会从此目录下查找。

有关该功能的介绍,可以看Go1.1.1新功能module的介绍及使用。

查找顺序

GO111MODULE=off时,如果一个包在vendor和$GOPATH下都存在,那么使用顺序为:

优先使用vendor目录下面的包,

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

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

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

补充: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 文件一旦创建后,它的内容将会被 go toolchain(工具链)完全掌控,比如:执行 go get、go build、go mod 等指令时,会自动修改和维护 go.mod 文件。

除了 go.mod 之外,go 指令还维护了一个 go.sum 文件,其中包含特定模块版本内容的加密哈希。go 指令使用 go.sum 文件来确保这些模块的哈希值,以确保项目所依赖的模块不会出现意外更改。

go.mod 和 go.sum 都应该应用于版本控制。 并且 go.sum 不需要手工维护,所以可以不用太关注。

使用 go mod

使用 Go Modules 需要配置 GO111MODULE 环境变量,GO111MODULE 有三个值:off、on 和 auto(默认值):

GO111MODULE=off:关闭 Go Modules,沿用旧版本的 GOPATH 方式,项目的依赖包依旧在 vendor 目录或者 $GOPATH/src 目录下进行查找。

GO111MODULE=on:开启 Go Modules,项目的依赖包记录在 go.mod 文件中。

GO111MODULE=auto:go 指令根据当前目录来决定是否启用 Modules 功能。

当项目处于 GOPATH/src 内,则会使用 GOPATH/src 的依赖包。

当项目处于 GOPATH/src 外,则使用 go.mod 里 require 声明的依赖包。

使用 go.mod 的流程:

在 $GOPATH/src 目录之外创建 Golang 项目。

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

$ go mod init

注意,项目下属的子目录是不需要再次 init 的,整个项目的依赖都会组织在根目录的 go.mod 文件里。

导入外部包:

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 是一个关键字,此外还有 module、replace 和 exclude:

module 语句:指定模块的名字(路径)。

require 语句:指定的依赖模块。

replace 语句:可以替换依赖项模块。

exclude 语句:可以忽略依赖项模块。

另外,上述的 v0.0.3 就是依赖包 converter 的版本。如果没有在 go.mod 指定版本,go 指令就会自动下载代码中的依赖的最新版本。否则,go 指令会根据 require 语句的路径和版本进行下载。指定版本时也可以用 latest,表示下载最新的版本。

replace 语句常用于依赖包实际路径变更的场景中,例如:

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

如此的,在这种情况下依赖包的维护会变得更简单。

还需要注意 go.mod 中的 module hello 这一条语句,因为当前项目已经不在 $GOPATH/src 内了,所以 module hello 标注了项目 “根” 的路径,以此来作为项目中其他包的根路径。

go mod 的子指令

初始化一个 Module:

go mod init

下载项目依赖的 modules 到本地 Cache:

# 在项目目录下执行

go mod download

注:目前所有模块版本数据均缓存在 $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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。

好了,本文到此结束,带大家了解了《Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Golang连接Redis数据库的方法Golang连接Redis数据库的方法
上一篇
Golang连接Redis数据库的方法
go语言实现sftp包上传文件和文件夹到远程服务器操作
下一篇
go语言实现sftp包上传文件和文件夹到远程服务器操作
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    24次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码