Go 包管理与依赖查找顺序
1. 规则:
- 同一目录下只能存在一个包
- 目录和目录下源文件的包命名可以不同
- 当包名与目录名不同时,导入的是目录
2. 编译时的依赖包查找机制
在 Go 支持 Go Modules 之后,编译时编译器会从工作目录(当前所在目录)开始并逐级向上查找是否具有 go.mod 文件。
- 如果有,go.mod 文件中声明的 module 名称就视作 go.mod 所在的路径,然后以指定的 main 包为依赖入口,所有以 go.mod 中声明的 module 名称开头的导入路径都以 go.mod 所在的路径为相对路径进行包的查找导入。所有需要导入的路径中如果在 go.mod 中指定了版本,则从 $GOPATH/pkg/mod/ 下取得相应版本进行导入,如果没有被指定则从 $GOPATH/src/ 或 $GOROOT/src/ 中进行查找导入。
- 如果没有,所有依赖均从
$GOPATH/src/
或$GOROOT/src/
中进行查找导入。
3.vendor
vendor
概念最早是由Keith提出,用来存放依赖包。
vendor的层级搜索
规则是:
- 从引用文件所在的
vendor
路径下面搜索, - 如果没有找到,那么从上层目录的
vendor
路径下面搜索, - 直到
src
的vendor
路径下面搜索。
4. modules
Go 1.11版本支持临时环境变量GO111MODULE
,通过该环境变量来控制依赖包的管理方式。
查找顺序
当GO111MODULE
=on
时,那么就会使用modules
功能:
这种模式下,$GOPATH
不再作为build时导入的角色,依赖包会存放在$GOPATH/pkg/mod
目录下。工程中的依赖包也会从此目录下查找.
GO111MODULE=off
时,如果一个包在vendor
和$GOPATH
下都存在,那么使用顺序为:
- 优先使用
vendor
目录下面的包, - 如果
vendor
下面没有搜索到,再搜索$GOPATH/src
下面的包, - 如果
$GOPATH
下面没有搜索到,那么搜索$GOROOT/src
下面的包, - 要么完整使用
vendor
下面的包,要么完整使用$GOPATH
下面的包,不会混合使用。
参考:
https://studygolang.com/articles/22793?fr=sidebar
https://blog.csdn.net/benben_2015/article/details/91455497
下一章,学习一下vendor和modules
Go 包管理与依赖查找顺序的更多相关文章
- Go依赖包管理--间接依赖
目录 1.indirect含义 1.2 直接依赖未启用 Go module 1.2 直接依赖 go.mod 文件不完整 2.总结 1.indirect含义 在使用 Go module 过程中,随着引入 ...
- JavaScript包管理器综述
JavaScript包管理器综述 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 对于JavaScript来说.包管理器 ...
- Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验 | SwiftCafe 咖啡时光
说起 iOS 开发的包管理,大家就不由得会想起 CocoaPods, 它确实是一个强大的工具.但这次咱们来关注另外一个包管理工具 Carthage,如果说 CocoaPods 像一个航母,一应俱全,坚 ...
- golang包管理工具及环境管理工具;如何下载外网的依赖包
简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...
- flutter如何使用配置文件pubspec.yaml(位于项目根目录)来管理第三方依赖包
官方文档 在软件开发中,很多时候有一些公共的库或SDK可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率.很多编程语言或开发工具 ...
- 项目jar包管理,使用 .userlibraries 文件增加jar包的可移植性,明确jar包依赖,多项目共用jar包里
当一个普通的项目,在不适用maven 等jar包管理工具的时候,通常我都会直接把jar 包复制lib下,并且在build path 中直接添加额外jar包,或者使用user_libraries包所用的 ...
- bower一个强大的前端依赖包管理工具
在介绍之前,你必须的知道bower是基于nodejs开发的,所以你首先必须得有个nodejs环境,至于这么安装nodejs网上一大堆教程,对了使用bower还需要安装git,这里就不多说了. #### ...
- 当通过Nuget包管理器获取还原组时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项
当通过Nuget包管理器获取还原组件时,出现 提示 “xxxxx”已拥有为“xxxxx”定义的依赖项 时 解决方法: 工具---扩展和更新,把Nuget包管理器卸载后,重启VS,再安装,现打开VS项 ...
- Maven入门-依赖管理(Jar包管理)(二)
1 依赖管理(Jar包管理) 1.添加依赖
随机推荐
- Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)
1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...
- Java中出现Unhandled exception的原因
说明某个方法在方法声明上已经声明了会抛异常,那么在调用这个方法的时候,就必须做异常处理,处理的方式有2种,要么try-catch这个异常,要么继续往上一层抛出这个异常,这是java语法要求的,必须这么 ...
- Course2.1 Graph Paper Programming
Overview 通过日常生活中的活动来体验程序算法,目标时能够将现实世界的场景与程序场景关联起来. Objective 抓住将现实世界问题转换为程序的难点: 你认为非常明确的指令在计算机看来可能还是 ...
- Win命令行切换Python版本
目录 安装2.x 和 3.x 的python 设置系统环境变量 pip的使用 参考 安装2.x 和 3.x 的python 我这里使用anaconda来安装两个版本的python包. conda cr ...
- Java 程序员每天都在做什么?
作为一名 在大.中.小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获.包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源. 先从我的第一份 Jav ...
- Azure Functions(三)集成 Azure Queue Storage 存储消息
一,引言 接着上一篇文章继续介绍 Azure Functions,今天我们将尝试绑定 Queue Storage,将消息存储到 Queue 中,并且学会适用于 Azure Functions 的 Az ...
- Zeebe服务学习2-状态机
1.什么是状态机? 第一次接触到这个名词,感觉自己是明白这个东东是啥的,但是后来发现,emm-,是的,只是理解了这个词而已. 贴一下官方介绍: 有限状态机,(英语:Finite-state machi ...
- 基于dlib+django+python 实现web端人脸打卡
face_recognition 基于python+django+dlib实现的人脸打卡系统 开始之前 windows用户需要安装 VS2017 其他VS版本也行 linux用户需要安装c++编译器( ...
- Tomcat后台爆破指南
0x00 实验环境 攻击机:Win 10 0x01 爆破指南 针对某Tomcat默认管理页面: (1)这里主要是介绍一种比较好用的burp爆破方法: 点击Tomcat后台管理链接 Tomc ...
- WPF 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量 bool ret; mutex = new System.Threading.Mutex(true, exename, out ret); if (!ret) { ...