Go依赖管理

news2024/11/26 9:52:39

"做讨厌潮汐的稚童,祈祷月球失踪。"

一、背景

我们写一个程序,例如输出hello world 或者 一个猜数字游戏,这些用到的单体函数接口,只需要依赖一些原生的SDK即可。但是,面对复杂的实际问题、工程,仅依赖这些原生的东西是不够的,因为我们需要关注的不仅仅是 业务逻辑的实现,还涉及到日志log,框架等等,需要引入其他sdk配合整体项目功能的实现、运行信息的完善。因此,对这些依赖包引入的管理,显得尤为重要。

Golang在解决依赖包管理的历史有三个阶段,也衍生为解决依赖包问题的三个版本,GOPATH / GOVENDER / GO MODULE。不同的环境,适合的依赖管理版本也不同。

二、$GOPATH

Golang本身就可以利用自己的能力,解决依赖包的管理。

(1)GOPATH目录

GOPATH是一个工作环境,是go语言支持的一个环境变量。此目录下存放正在开发的代码,编译后的依赖包,依赖包的源码以及可执行文件(bin)。

默认路径(win10):
  • bin 用来存放编译后的二进制文件

  • pkg用来存放编译后的归档文件(加速编译)

  • src 用来存放我们源代码和下载的第三方依赖

(2)Go命令工具

go get;

下载依赖包的最新版本到GOPATH指定目录

go install;

一般在项目目录下执行此命令,项目需要包含main package和func main入口函数。

go build;

编译成二进制可执行文件。

(3)GOPATH的弊端

如果GOPATH能够解决实际中的所有问题,也就不会有另外两个版本的出现。

我们知道,GOPATH会把所有项目所用到的库放在同一个文件pkg当中。如果此时Pro

A依赖 库v1版本,而ProB依赖库v2的版本,但是src下只能支持一个版本的存在。

1.在使用go get的时候,无法知道拉取的 依赖包是什么版本。
2.多人协作时,无法不保证你自己与人家的第三方库使用的是同一个版本。
3.当你拉取包下来的时候,你无法处理不同版本包的引用问题。

三、Go Vender

为了解决依赖管理中的遗留问题,Go引入了vendoring机制。简单来说,就是把项目中依赖到的模块,直接拷贝到项目目录中,跟随项目源码一起做版本管理。

在vendor机制下,会优先使用目录中Vender的依赖。如果依赖不存在,则会去GOPATH中寻找

(1)Go Vendor的弊端

此时的项目A依赖pkg 1,2。而,pkg1、2又分别依赖pkg3、4,这两个版本用Vendor的管理方式不能很好的控制依赖包的版本。从而,到编译项目的时候,又会出现依赖错误。

四、Go Moudle

Go mod目前是Go的官方解决方案,解决了GOPATH、GOVENCOR遗留的依赖管理的问题,和无法依赖同一个库多个版本的问题。

(1)管理三要素

  • 配置文件、描述依赖关系go.mod

  • 中心仓库存储、分发依赖 Proxy

  • 本地工具 go get/mod

进行项目创建时,在配置文件go.mod中声明依赖版本,去中心仓库Proxy下载对应的版本包到本地,并进行编译。

可以看出,这样做就实现了 项目依赖的包不是代码,而是代码的版本,而对这个代码版本的控制,也就成了对配置文件的管理。从而,实现从编码 与 版本控制之间的解耦。

(2)配置文件go.mod

在项目的根目录下,记录当前依赖包信息的普通文件。

这里的GOMOD出现了两个声明依赖的格式。

module: 模块名
go指令的版本号

任意一个依赖单元用: 模块路径+版本来唯一标识。

(3)Proxy中心仓库

因为源代码仓库拥有者可以对自己的源码增删查改,那么势必会对正在使用这些代码的人有影响。为了解决这一个问题,go便引入了Proxy中心仓库,作为缓冲,来解决这种不稳定性。

(4)本地工具

go mod;

module语句指定包的名字(路径)
require语句指定的依赖项模块
replace语句可以替换依赖项模块
exclude语句可以忽略依赖项模块

使用go mod的包管理方式,依赖的第三方包被下载到了$GOPATH/pkg/mod路径下

go get;

// 为当前项目拉取依赖
// 下载的依赖包放到缓存中,并在go.mod文件中新增一条require记录
go get example.org/pkg

向Proxy代理服务器 下载依赖包。

单纯潦草地写写。感谢你的阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用构建工具创建Vue项目

使用构建工具创建Vue项目一、使用vue-cli脚手架构建vue项目创建步骤:二、使用 Vite构建vue项目创建步骤:一、使用vue-cli脚手架构建vue项目 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 1 通过 vue/cli 实现的交互式…

演讲比赛流程管理系统

1. 演讲比赛程序需求 1.2程序功能 2. 项目创建 创建名为speech_contest的目录名称 3. 创建管理类 功能描述: 提供菜单界面与用户交互 对演讲比赛流程进行控制 与文件的读写交互 3.1 创建文件 在头文件和源文件的文件夹下分别创建speech…

ubuntu 学习笔记

环境:Ubuntu 22.04 桌面版和server版 一、更换国内源,下载更快 1、源文件路径:/etc/apt/sources.list,到这个路径下备份一下源文件。 #备份原有配置文件命令 sudo cp -r /etc/apt/sources.list /etc/apt/sources.list.backup …

C primer plus学习笔记 —— 14、限定关键字(const、volatile、restrict、_Atomic)

文章目录const 关键字修饰变量修饰指针修饰形参修饰全局变量volatile关键字restrict关键字_Atomic关键字(c11)const 关键字 修饰变量 将变量变为只读 const int nochange; nochange 4; //不允许 const int a 5; //没问题const int a[3] {3, 5, 6};…

Hive--14---使用sum() over() 实现累积求和

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录Hive中使用over()实现累积求和1.总求和sum(需要求和的列) over(partition by 分组列 )数据准备需求1以地区号网点号币种 为唯一键,求总的金额需求2以地区…

python图像处理(高斯滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在谈高斯滤波之前,我们不妨回顾一下之前谈到的均值滤波和中值滤波。均值滤波,就是对像素点以及周围的8个点计算平均值,然后赋值给新像素点。而中值滤波,则是对像素点及周围的8个…

6. 初识多线程编程

1. 多线程 多线程非常重要,工作中用到的也是非常多,面试时也100%会问多线程。 关于多线程的相关知识,可以参考《计算机操作系统(第四版)》,或者自行百度查看有关文章以及视频都可以,此处不再赘述。 2. python中的多…

常用网址-2023整理

办公&效率人民币大写转换 人民币大写 人民币RMB数字转大写汉字工具我的账单 - 支付宝Bypass - 分流抢票Zen Flowchart - 在线流程图MindMaster - 在线思维导图【抠图】在线抠图软件_AI抠图证件照换底色-稿定设计Visio模板推荐与VisualNet图库转化语音转文字iconfont-阿里巴…

LeetCode动态规划经典题目(九):middle

学习目标: 进一步了解并掌握动态规划 学习内容: 4. LeetCode62. 不同路径https://leetcode.cn/problems/unique-paths/ 5. LeetCode63. 不同路径 IIhttps://leetcode.cn/problems/unique-paths-ii/ 6. LeetCode343. 整数拆分https://leetcode.cn/pro…

人工智能学习06--pytorch06--神经网络骨架nn.Module scipy下载 现有网络模型的使用及修改(VGG16)

神经网络骨架nn.Module 括号里nn.Module表示继承Module类init 初始化 调用父类初始化函数forward scipy下载 pip install scipy -i https://pypi.douban.com/simple/ 现有网络模型的使用及修改(VGG16) pretrained为True时需要下载,在ima…

1. Spring 基础入门

文章目录1. 初识 spring1.1 系统架构1.2 学习路线1.3 核心概念2. IoC 与 DI 入门案例(xml版)2.1 IoC(控制反转)2.2 DI(依赖注入)3. bean 配置3.1 bean 基础配置3.2 bean 别名配置3.3 bean 作用范围配置4. b…

file控件与input标签的属性type=“hidden“标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>file控件于与input标签的属性type"hidden"标签</title> </head> <body bgcolor"antiquewhite"> …

k8s中使用Deployment控制器实现升级、回滚、弹性伸缩

前置条件&#xff1a;linux机器已安装k8s集群基于yaml文件创建pod,本次创建pod使用的web.yaml如下apiVersion: apps/v1 kind: Deployment metadata:creationTimestamp: nulllabels:app: webname: web spec:replicas: 2selector:matchLabels:app: webstrategy: {}template:metad…

从零开始的数模(八)TOPSIS模型

一、概念 1.1评价方法概述 1.2概念 TOPSIS &#xff08;Technique for Order Preference by Similarity to an Ideal Solution &#xff09;模型中文叫做“逼近理想解排序方法”&#xff0c;是根据评价对象与理想化目标的接近程度进行排序的方法&#xff0c;是一种距离综合评…

SAP入门技术分享六:搜索帮助

搜索帮助1.概要&#xff08;1&#xff09;利用ABAP数据字典的搜索帮助&#xff08;2&#xff09;利用画面的搜索帮助&#xff08;3&#xff09;Dialog程序中的搜索帮助&#xff08;4&#xff09;报表选择屏幕PARAMETERS的搜索帮助&#xff08;5&#xff09;搜索帮助类型2.创建搜…

plot4gmns:面向通用建模网络范式(GMNS)的快速可视化【v0.1.1】

一款面向通用建模网络范式&#xff08;GMNS&#xff09;的快速可视化工具 目录1. 标准数据框架2. 标准数据框架下的生态2.1 数据解析2.2 数据处理2.3 数据可视化3. 标准数据框架下的可视化3.1 基础语法3.2 进阶语法1. 标准数据框架 制定一套标准的数据框架&#xff0c;可实现不…

python图像处理(中值滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 中值滤波和均值滤波的区别,有点像中位数收入和平均收入的区别。比如有三个人,年收入分别是10万、1万和1千,那么他们的平均收入就是(10+1+0.1)/3,平均数是3.3万左右,但是中位数…

《真象还原》读书笔记——第二章 编写 MBR 主引导记录

2.1 计算机的启动过程 开机后运行的第一个程序是 BIOS 。 BIOS 搬运 MBR 并 跳转运行 MBR… 2.2 软件接力第一棒 BIOS 全名 基本输入输出系统。 2.2.1 实模式下的 1MB 内存分布 2.2.2 BIOS 是如何苏醒的 BIOS本身不需要修改&#xff0c;于是被写入了ROM中&#xff0c;被映…

更换新电脑,如何将旧电脑数据/文件传输到新电脑?

最好的数据迁移工具提供了一种简单的解决方案&#xff0c;可将您的数据从一台 PC 传输到另一台 PC。 如果您以前没有做过&#xff0c;那么数据迁移的整个过程可能看起来很吓人。无论您是企业用户还是家庭用户&#xff0c;尝试将所有文​​件和文件夹从一台计算机迁移到另一台计…

CCPC2022(桂林)

题目链接&#xff1a;https://codeforces.com/gym/104008 G Group Homework 题目大意&#xff1a;在树上选出两条链&#xff0c;使得在两条链选中的点中&#xff0c;只被一条链选中的点的点权和最大。 题解&#xff1a;显然两条链要么不相交&#xff0c;要么只相交于一个点。…