首页 > 其他分享 >2月摸鱼计划04 Go语言依赖管理

2月摸鱼计划04 Go语言依赖管理

时间:2024-02-06 21:03:05浏览次数:48  
标签:依赖 摸鱼 04 项目 go 版本 Go 2.1

2.0 依赖管理

这一章我们主要讲解go的依赖管理, 主要涉及go依赖管理的演进路线和go module实践

2月摸鱼计划04 Go语言依赖管理_不同版本

依赖指各种开发包

对于hello world以及类似的单体函数只需要依赖原生SDK,而实际工程会相对复杂,我们不可能基于标准库0~1编码搭建,而更多的关注业务逻辑的实现,而其他的涉及框架、日志、driver、以及collection等一系列依赖都会通过sdk的方式引入, 这样对依赖包的管理就显得尤为重要

2.1 Go依赖管理演进

2月摸鱼计划04 Go语言依赖管理_不同版本_02

2.1.1 GoPATH

GOPATH是Go语言支持的一个环境变量,value是Go项目的工作区

目录有以下结构:

src: 存放Go项目的源码pkg: 存放编译的中间产物,加快编译速度;

bin: 存放Go项目编译生成的二进制文件

大家想想用gopath依赖管理有 哪些弊端呢?

2月摸鱼计划04 Go语言依赖管理_Go_03

弊端

2月摸鱼计划04 Go语言依赖管理_不同版本_04

如图,同一个pkg,有2个版本,A-> A0,B-> B0.

而src下只能有1个版本存在,那AB项目无法保证都能编译通过。 也就是在gopath管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这很显然不能满足我们的项目依赖需求。为了解决这问题,govender出现了

2.1.2 GoVendor

2月摸鱼计划04 Go语言依赖管理_Go_05

Vendor是当前项目中的一个目录,其中存放了当前项目依赖的副本,在Vendor机制下,如果当前项目存在Vendor目录,会优先使用该目录下的依赖,如果依赖不存在,会从GOPATH中寻找。 vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题,下面我们看一个场景

2月摸鱼计划04 Go语言依赖管理_不同版本_06

如图项目A依赖pkg b和c,而B和C依赖了D的不同版本,通过vendor的管理模式我们不能很好的控制对于D的依赖版本,一旦更新项目,有可能带来依赖冲突。

归根结底vendor不能清晰的标识依赖的版本概念原因是:他还是依赖源码

下面,go mod就应运而生了。

2.1.3 Go Module

2月摸鱼计划04 Go语言依赖管理_Go_07

Go Modules 是Go语言官方推出的依赖管理系统,解决了之前依赖管理系统存在的诸如无法依赖同一个库的多个版本等问题

G0 module从1.11 开始实验性引入,1.16 默认开启;我们一般都读为go mod,我们也先统一下名称

2.2 依赖管理三要素

2月摸鱼计划04 Go语言依赖管理_依赖管理_08

那其实完善的依赖管理一般都需要3要素,这里我们先整体介绍下

这里熟悉java的同学,可以类比下maven

标签:依赖,摸鱼,04,项目,go,版本,Go,2.1
From: https://blog.51cto.com/u_16557322/9631406

相关文章

  • Django
    Django一、MTV和MVC的区别首先介绍Django的设计模式,也就是MTV,在这之前我们先了解MVC模式。1、MVC设计模式MVC是Model-View-Controller的缩写Model代表数据存储层,是对数据表的定义和对数据的增删改查;View代表视图层,是系统前段显示部分,它负责显示什么和如何进行显示;Controll......
  • golang之设计模式
    [选项模式]packagemainimport"fmt"typeOptionFuncfunc(*DoSomethingOption)typeDoSomethingOptionstruct{aintbstringcbool}funcNewDoSomethingOption(cbool,opts...OptionFunc)*DoSomethingOption{s:=&DoSomethi......
  • mongodb大数据量分页查询优化
    业务背景mongodb大数据量分页查询主要耗时是查询总条数,所以有两种优化方式1.不查询总条数,查询最近N页数据[改动略多,执行耗时很短]2.增加页面时间范围必填条件[改动很小,执行耗时略长,与数据量有关][比如默认查询创建时间最近一个月的数据根据数据量做调整,创建时间有组合索引]这两种......
  • ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排
    作者:庄宇什么是 Fan-outFan-in在工作流编排过程中,为了加快大任务处理的效率,可以使用Fan-outFan-in任务编排,将大任务分解成小任务,然后并行运行小任务,最后聚合结果。由上图,可以使用DAG(有向无环图)编排Fan-outFan-in任务,子任务的拆分方式分为静态和动态,分别对应静态DAG......
  • Ubuntu18.04定时备份MySQL、PostgreSQL数据库
    1、备份MySQL数据库脚本LOG_DATE=`date+'%Y-%m-%d%H:%M:%S'`LOG_PATH=/home/dbserver/script_data/backup.logecho"$LOG_DATE=======>开始备份以下mysql数据库:">>${LOG_PATH}DUMP=/usr/bin/mysqldumpOUT_DIR=/home/dbserver/backup/mysql_backupLINU......
  • ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'mysql&
    转自https://www.cnblogs.com/jiangfeilong/p/10560754.html 关键要授予 WITHGRANTOPTION;#原因:修改数据库账号时删除了默认的localhostroot, 新建了%root 但没有赋予全部权限;解决方法:1.关闭数据库#mysqldstop2.在my.cnf里加入skip-grant-tables3.停止服务器......
  • [ Go] GoRoutines and Channels
    AgoroutineistheGowayofsuingthreads,weopenagoroutinejustbyinvokinganyfunctionwithagoprefix.gofunctionCall()Goroutinescancommunicatethroughchannels,anspecialtypeofvariable,achannelcontainsavalueofanykind,aroutinec......
  • Typora PicGo SM
    TyporaPicGoSM.MS图床设置在程序猿的世界中,只有输出,不断输出才能成为自己在工作中的源头活水,因此在工作中,不断的记录遇到的问题和解决的思路和过程,对于锤炼思考有着十分重要的过程。文章写作作为文笔输出的重要部分,因此在工作生涯中扮演者举足轻重的作用。本文介绍了使用Typora......
  • GO镜像
    UNIX#启用GoModules功能goenv-wGO111MODULE=on#配置GOPROXY环境变量,以下三选一#1.七牛CDNgoenv-wGOPROXY=https://goproxy.cn,direct#2.阿里云goenv-wGOPROXY=https://mirrors.aliyun.com/goproxy/,direct#3.官方goenv-wGOPROXY=https:......
  • SQL数据库入门04:数据查询操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表中多种数据查询方法的具体操作。(数据库基础(四):数据查询)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用自己手头的数据,可以将相关操作与分析过程......