Go语言依赖管理三要素示例解析
作者:啵啵肠 发布时间:2024-05-05 09:32:34
背景
开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率
对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发
对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上
工程项目不可能基于标准库0-1编码搭建
管理依赖库
GOPATH 模式
GOPATH为环境变量 包含bin、pkg、src三部分
$GOPATH:项目根路径
src:项目源代码
bin:项目编译的二进制文件 可执行程序
pkg:项目编译的中间产物 加速编译 第三方依赖包
运行方式:
所有工程代码要求放在GOPATH/src目录下 工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用 在 $GOPATH/src
下进行 .go 文件或源代码的存储,我们可以称其为 GOPATH 的模式
缺点:
没有版本控制的概念
所有项目都要放在
$GOPATH/src
目录下,不在当前目录则不能编译
GO Vendor模式
解决 GOPATH模式 所有项目都在$GOPATH/src
目录的问题 可以随处可以创建项目,不用扎堆 src 目录下
原理:本地化构建
在每个项目下都创建一个vendor目录,每个项目所需要的以来都会下载到自己的vendor目录下。在使用包时,会先从当前项目下的vendor目录查找,然后再从GOPATH中查找,都没有找到最后才在GOROOT中查找(依赖寻址方式:vendor -> GOPATH)
缺点:
放弃了依赖重用,使得冗余度上升
无法控制依赖的版本 更新项目可能出现依赖冲突 导致编译出错
Go Module模式
1.16版本后默认开启的模式
通过go.mod
文件管理依赖的版本
通过go get/go mod
指令工具管理依赖包
工程不用全放在gopath/src
目录下
定义版本规则和管理项目依赖关系
主要改动:
GO MODULE模式下所有依赖的包存放在
$GOPATH/pkg/mod
目录下项目中需要有
go.mod
文件,来应用$GOPATH/pkg/mod
依赖管理三要素
配置文件 描述依赖
go.mod
中心仓库管理依赖库
Proxy
本地工具
go get/mod
依赖配置 go.mod
module example.com/foobar
go 1.16
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0
replace example.com/banana => example.com/hugebanana
go.mod
是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:
module
:用于定义当前项目的模块路径。go
:用于设置预期的 Go 版本。require
:用于设置一个特定的模块版本。exclude
:用于从使用中排除一个特定的模块版本。replace
:用于将一个模块版本替换为另外一个模块版本。
这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version
,目前从 Go1.16 的代码里来看,还只是个标识作用,暂时未知未来是否有更大的作用。
go mod命令
常用的go mod命令如下:
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹, 创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
go get命令
在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
运行go get -u=patch将会升级到最新的修订版本
运行go get package@version将会升级到指定的版本号version 如果下载所有依赖可以使用go mod download命令。
快速使用go module
SET GOPROXY=goproxy.cn (这是win环境下的) export GOPROXY=goproxy.cn (这是mac环境下的)
go mod init [包名] // 初始化项目(如果你是初始化项目直接
go mod init
就好了)在目录文件下会生成go.mod和go.sum文件 go.mod 里面包含了所有的包!
在文件里面引入包名的时候有的编辑器会报错但是是可以正常编译的
下载包使用go get
修改包的版本号直接去go.mod文件修改然后go mod download
小结
今天学习到的内容还需要进一步的消化,我也是打算将并发编程这一块的内容熟悉透彻了再进行下一部分的课程学习。如果笔记中有错误的地方也希望掘友们可以及时的提出纠正。
来源:https://juejin.cn/post/7190051371129765925


猜你喜欢
- 清除浮动这个问题的提出,在现在来说应该算是一个非常古老的问题了,很多人对解决办法估计也能烂记于心了,但是我这个落后了不少的前端开发程序员,太
- 引言这两天遭遇了手机号登录相关的压测需求,算是比较棘手的。主要原因有两个,第一:之前从来没有接手过这个项目,不熟悉各种规则;第二:数据量偏大
- 本文实例讲述了Python实现随机创建电话号码的方法。分享给大家供大家参考,具体如下:当需要随机的生成一些电话号码的时候,可以使用以下脚本,
- MySQL 5.1采用了基于密码混编算法的鉴定协议,它与早期客户端(4.1之前)使用的协议不兼容。如果你将服务器升级到4.1之上,用早期的客
- 实现过程最近在尝试openai的相关函数,所以今天就来盘点盘点下 createChatCompletion 函数,听说是专门为了聊天创立的a
- 为什么要同步SQL Server 2000 数据库,它都用在什么场合SQL Server 2000 数据库同步配置的原理从0开始一步一步配置
- 这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,
- 目录题目描述:思路:代码:改良版采用递归数学方法题目描述:编写一个算法来确定一个数字是否“快乐”。 快乐的数字按照如下方式确定:从一个正整数
- 前言: 最近正在上一门Python数据处理的课程,要用到Jupyter,于是就先安装了
- 在python中读取csv文件时,一般操作如下:import pandas as pdpd.read_csv(filename)该读文件方式
- 核心代码:#!/usr/bin/python# -*- coding: UTF-8 -*-import smtplibimport osim
- 1. 使用.logfile 方法#!/usr/bin/env pythonimport pexpectimport syshost=&quo
- 一、python中List添加元素的几种方 * ist 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义
- 1. 实例描述通过爬虫获取网页的信息时,有时需要登录网页后才可以获取网页中的可用数据,例如获取 GitHub 网页中的注册号码时,就需要先登
- <?php /** * Created by JetBrains Ph
- 用CSV格式来保存文件是个不错的主意,因为大部分程序设计语言和应用程序都能处理这种格式,所以交流起来非常方便。然而这种格式的存储效率不是很高
- 如果你现在正在使用Restful API,并且你需要通过web项目来构建json格式字符串的响应,那么这篇文章将帮助你使用javascrip
- 脚本之家下载地址:https://www.jb51.net/softs/79861.html官网下载地址:http://www.micros
- 前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能希望满足某些条件才执行某些测试用例,否则
- 这是《python基础教程》中的第二个项目,关于python操作PDF。涉及到的知识点1、urllib的使用2、reportlab库的使用这