go基础-依赖管理

这篇具有很好参考价值的文章主要介绍了go基础-依赖管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有些不可思议,简洁、优雅的go语言依赖管理如此混乱,发布多年也没有可靠的依赖管理机制,官方先后推出了多种依赖管理机制gopath、vendor、dep等,没有一个顺手,直到在Go 1.11推出go mod才有所缓解,也谈不上优秀,相比maven弱爆了。

主流语言都有官方依赖包站点,如maven、pip、npm等。奇葩的是go没有官方依赖包站点,第三方包可以使用任意开源站点发布,没有官方站点导致诸多问题,如下载地址,版本管理、包说明文档等。没有统一下载地址,大聪明给出的方案包名就是包的下载地址,当然全球最大的开源平台是github,大量包都发布在github.com站点,很多第三方包名是github.com/xx/${pageName},但也有不少使用其他站点发布,如k8s.io、bazil.org、gobot.io等多如牛毛,直接导致无法搭建加速镜像站点,国内的都是代理方式加速(当然可增加缓存),相比加速镜像站也是弱爆了。另外也限定包名的格式,只要包会被其他项目使用就必须是下载地址,就算在企业内部私有包也不例,否则就纯人肉维护依赖。包没有标准文档格式、API说明等,后来go官方提供pkg.go.dev站点,统一文档风格、包检索,注意仅仅收录包信息以及展示,包还是在任意站点发布,都提供了官方站点,为啥不进一步支持发包发布功能呢。

 

gopath

是go重要环境变量,称为工作目录,在 1.5 版本之前使用,通过go get ${packageName}命令下载依赖包,总是下载最新版本,且都是存放在 ${GOPATH}/src 目录下,没有版本控制。

使用import导入依赖包,查找路径固定为:${GOROOT}/src -> ${GOPATH}/src
  • ${GOROOT}/src GOROOT表示go sdk的安装目录,src存放了go的标准库
  • ${GOPATH}/src GOPATH表示go 的工作目录,src存放了所有的go项目
注意导入项目内部模块,也是从固定路径计算,导致所有项目必须放在工作目录下,否则会出现依赖找不到。这与其他语言较大区别,如java、python都支持从项目路径计算,项目可放在任意目录。

项目名称是demo,导入依赖方式如下
import "fmt"                               // 导入标准库包
import "demo/utils"                        // 导入项目内的工具模块包, 注意也从绝对路径查找
import "github.com/forgoer/openssl"        // 导入外部第三方包

fmt是标准库在GOROOT/src,其他包都必须在GOPATH/src目录下。

 

vender

Go 1.5 版本推出了 vendor 机制,就是每个项目下可有一个 vendor 目录,存放了该项目的依赖的 package。go build 时先去 vendor 目录查找依赖,没有再去 GOPATH 查找。调整后依赖查找顺序为:${GOROOT}/src -> ${Project}/vendor -> ${GOPATH}/src。

该机制是解决依赖版本控制问题,原理是每个项目依赖可独立目录管理,避免相互影响。注意此时依赖包依然没有版本概念,仅独立目录管理,要固定依赖包版本,只能连同vendor目录把第三方依赖一起提交至代码仓库,这带来了一大堆新问题,庞大的 vendor 目录需要提交到代码仓库,不仅占用代码仓库空间,减慢仓库下载和更新的速度,而且还会干扰代码评审,对代码统计等效能工具也有比较大影响。对多人协作开发更加复杂,包括项目依赖包的分析、版本的记录、依赖包获取和存放等。不知道那个大聪明提出了vendor方案。

 

dep

Go 1.9 版本推出了实验性质的包管理工具 dep,也是一团糟,懒得介绍。

 

go mod

Go 1.11 版本推出了go mod依赖管理机制,才有实质性进步,达到可用状态。每个项目新增go.mod文件,维护该项目包依赖信息,包括依赖包的版本号。该文件使用go mod init ${ProjectNmae}命令创建,文件内容由 go 自动维护,每次下载依赖、升级依赖时会自动更新该文件。
使用前需要开启该技能,通过环境变量控制GO111MODULE:off 表示关闭,继续从 vendor、GOPATH 中查看依赖。on表示开启,项目必须有go.mod文件。未设置或auto(1.13后默认模式),表示自动模式,自动判断是否启用,项目不在GOPATH/src目录且有go.mod文件,

初始化go mod,在项目目录下执行
go mod init demo    // demo是项目名称

 

在当前目录生成go.mod文件,描述项目依赖信息,文件结构也很简洁
$ cat go.mod
module demo        // 包名

go 1.19            // go版本

 

手动下载依赖
$ go get github.com/forgoer/openssl  # 默认下载最新版本

 

也新增了自动分析依赖技能,分析代码所有依赖包,添加缺少的依赖,删除未使用的依赖

$ go mod tidy
貌似新版go build 和 go run 时也会自动下载依赖。
 

自动下载 和 手动下载,都会自动更新go.mod文件,添加依赖的包、版本,以及间接依赖,如下内容
module demo

go 1.19

require github.com/forgoer/openssl v1.6.0        // 表示依赖

require (
    github.com/bytedance/sonic v1.9.1 // indirect
    github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirectd
    github.com/gabriel-vasile/mimetype v1.4.2 // indirect
    ...
)
总算有个比较完整的依赖配置文件,包含直接依赖、间接依赖、版本号等,其中indirectd表示间接依赖。注意还会自动生成go.sum文件,维护了每个依赖包的hash值,增加校验,以免篡改。
 

默认总是下载最新版本,也可指定版本下载
// 下载最新版本, 默认方式
$ go get github.com/forgoer/openssl@latest     

// 下载指定版本
$ go get github.com/forgoer/openssl@v1.6.0     

使用git管理依赖,使用release tag标记版本号,如果仓库没有标记tag,则拉取最新的commit,此时版本号是:v0.0.0-主干分支最新commit的时间-commit哈希,称为伪版本
require golang.org/x/lint v0.0.0-20200302205851-738671d3881b
 
另一个变化下载路径也有调整,从${GOPATH}/src 变更为 ${GOPATH}/pkg/mod,同时终于支持从项目路径导入了,与之配合import的导入路径也发生了变化${GOROOT}/src/ -> ${ProjectDir}/ ->${GOPATH}/pkg/mod/。终于项目不用强制在工作目录下了,可存放任意位置。
查看依赖包下载目录
$ ls -lh ~/go/pkg/mod/
total 4.0K
drwxr-xr-x  3 root root   34 Jul 26 05:44 cache                            # 也增加了缓存技能
drwxr-xr-x  2 root root   36 Jul 26 05:59 demo2
drwxr-xr-x 22 root root 4.0K Jul 26 05:47 github.com
drwxr-xr-x  3 root root   15 Jul 26 05:45 golang.org
drwxr-xr-x  3 root root   30 Jul 26 05:46 google.golang.org
drwxr-xr-x  4 root root   79 Jul 26 05:47 gopkg.in
查看具体包
$ ls -lh ~/go/pkg/mod/github.com/forgoer/
total 4.0K
dr-xr-xr-x 3 root root 4.0K Jul 26 05:44 openssl@v1.6.0            # 目录名称增加了版本号

go.mod 配置文件其他指令,replace表示替换包
module demo

go 1.19

replace (
    github.com/Luzifer/go-openssl v1.10 => replace github.com/forgoer/openssl v1.6.0  // 替换
)
当依赖的包各种原因无法下载,可使用replace替换,代码不变,包被替换了。

exclude表示排除某个指定版本包
module demo

go 1.19

exclude github.com/forgoer/openssl v1.6.0    // 排除包
require github.com/forgoer/openssl v1.5.0    // 会自动下载其他版本
当排除的是新版本时,下载会自动降级到次新版本

升级指定依赖包
$ go get -u  github.com/forgoer/openssl
查看可升级的依赖包
go list -m -u all  检查所有可升级的包

 文章来源地址https://www.toymoban.com/news/detail-605626.html

查看所有项目所有依赖
$ go list -m all

$ go list -m -json all    // 以json格式输出依赖项目依赖

编辑依赖
$go mod edit -require="github.com/tin-gonic/gin@v1.90"                      // 添加依赖
$go mod edit -replace="golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest"   // 替换依赖
$go mod edit -exclude="github.com/gin-gonic/gin@v1.9.0"                       // 排除依赖
当然也可以直接vim打开文件编辑

更多操作
  • go mod download :手动触发下载依赖包到本地 cache
  • go mod graph :打印项目的模块依赖结构
  • go mod edit :编辑 go.mod 文件
  • go mod verify:校验模块是否被篡改过
  • go mod why: 查看为什么需要依赖
  • go mod vendor:导出项目所有依赖到 vendor 下

到了这里,关于go基础-依赖管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【GO语言依赖】Go语言依赖管理简述

    在运行环境中,遭遇报错,显示找不到函数 经过研究后发现需要进行依赖管理,进行如下操作后解决: 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,就需

    2024年01月16日
    浏览(43)
  • 【Go】依赖包管理

    2024年01月24日
    浏览(53)
  • Go语言之依赖管理

    go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。 GO111MODULE 要启用go module支持首先要设置环境变量GO111MODULE 通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。 GO111MODULE=off禁用模块支

    2024年02月12日
    浏览(40)
  • 使用Go模块进行依赖管理

    摘要:本文将介绍Go语言中的模块(module)概念,以及如何使用Go模块进行依赖管理。我们会探讨模块的基本概念、使用方法、配置和依赖关系管理等方面的内容。 Go语言自2007年发布以来,一直以其简洁、高效和强大的网络编程能力而受到开发者的喜爱。然而,随着项目规模

    2024年02月08日
    浏览(69)
  • 3.go-mod依赖管理

    提示:文章写的差不多的时候补上 略 go 语言项目中对于第三方库和插件采用go mod 的方式管理go 工程依赖的包。 命令如下(示例): 代码如下(示例): 略

    2024年02月11日
    浏览(44)
  • Go 语言进阶与依赖管理 | 青训营

    Powered by: NEFU AB-IN GO语言工程实践课后作业:实现思路、代码以及路径记录 Go可以充分发挥多核优势,高效运行 Goroutine 是Go语言中的 协程 ,一种 轻量级的线程 ,由Go语言的运行时管理,可以实现高并发的程序设计,由于轻量级的特性,goroutine可以创建成千上万个,而且消耗

    2024年02月11日
    浏览(41)
  • Go 语言并发编程 及 进阶与依赖管理

    协程可以理解为 轻量级线程 ; Go更适 合高并发场景原因 之一: Go语言 一次可以创建上万协成 ; “快速”: 开多个协成 打印。 go func() : 在 函数前加 go 代表 创建协程 ; time.Sleep() : 协程阻塞,使主协程 在 子协程结束前阻塞不退出 ; 乱序输出 说明并行 ; 通过通信共享内

    2024年02月13日
    浏览(52)
  • 解放你的依赖管理:Go mod包管理工具详解

    Go语言作为一门开源的编程语言,已经广泛应用于各个领域。作为一门现代化的编程语言,Go语言支持模块化开发,而包和依赖管理是模块化开发的重要组成部分。Go mod作为Go语言的官方包管理工具,可以帮助开发者更好地管理包和依赖,提高开发效率和项目可维护性。本文将

    2024年02月07日
    浏览(50)
  • Maven 基础之依赖管理、范围、传递、冲突

    坐标和 mvnrepository 网站 在 maven 中通过『 坐标 』概念来确定一个唯一确定的 jar 包。坐标的组成部分有: 元素 说明 groupId 定义当前 Maven 组织名称 artifactId 定义实际项目名称 version 定义当前项目的当前版本 [✔] 注意 任意两个不同包,它们的这三个属性必定至少有一项是不同

    2024年02月12日
    浏览(44)
  • GO编程语言:简洁、高效、强大的开源编程语言

    在现代软件开发领域,随着应用复杂度的不断提升,开发人员对编程语言的需求也日益增长。GO编程语言,作为一种简洁、高效且具备强大并发能力的新型开源编程语言,逐渐成为了许多开发者的首选。本文将详细介绍GO语言在哪些项目开发中表现出色,以及为什么许多开发者

    2024年02月02日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包