go基础-依赖管理
主流语言都有官方依赖包站点,如maven、pip、npm等。奇葩的是go没有官方依赖包站点,第三方包可以使用任意开源站点发布,没有官方站点导致诸多问题,如下载地址,版本管理、包说明文档等。没有统一下载地址,大聪明给出的方案包名就是包的下载地址,当然全球最大的开源平台是github,大量包都发布在github.com站点,很多第三方包名是github.com/xx/${pageName},但也有不少使用其他站点发布,如k8s.io、bazil.org、gobot.io等多如牛毛,直接导致无法搭建加速镜像站点,国内的都是代理方式加速(当然可增加缓存),相比加速镜像站也是弱爆了。另外也限定包名的格式,只要包会被其他项目使用就必须是下载地址,就算在企业内部私有包也不例,否则就纯人肉维护依赖。包没有标准文档格式、API说明等,后来go官方提供pkg.go.dev站点,统一文档风格、包检索,注意仅仅收录包信息以及展示,包还是在任意站点发布,都提供了官方站点,为啥不进一步支持发包发布功能呢。
gopath
使用import导入依赖包,查找路径固定为:${GOROOT}/src -> ${GOPATH}/src
- ${GOROOT}/src GOROOT表示go sdk的安装目录,src存放了go的标准库
- ${GOPATH}/src GOPATH表示go 的工作目录,src存放了所有的go项目
项目名称是demo,导入依赖方式如下
import "fmt" // 导入标准库包
import "demo/utils" // 导入项目内的工具模块包, 注意也从绝对路径查找
import "github.com/forgoer/openssl" // 导入外部第三方包
fmt是标准库在GOROOT/src,其他包都必须在GOPATH/src目录下。
vender
该机制是解决依赖版本控制问题,原理是每个项目依赖可独立目录管理,避免相互影响。注意此时依赖包依然没有版本概念,仅独立目录管理,要固定依赖包版本,只能连同vendor目录把第三方依赖一起提交至代码仓库,这带来了一大堆新问题,庞大的 vendor 目录需要提交到代码仓库,不仅占用代码仓库空间,减慢仓库下载和更新的速度,而且还会干扰代码评审,对代码统计等效能工具也有比较大影响。对多人协作开发更加复杂,包括项目依赖包的分析、版本的记录、依赖包获取和存放等。不知道那个大聪明提出了vendor方案。
dep
go mod
使用前需要开启该技能,通过环境变量控制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
查看依赖包下载目录
$ 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 检查所有可升级的包
$ 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基础-依赖管理的更多相关文章
- 着重基础之—构建工具—Maven的依赖管理
着重基础之—构建工具—Maven的依赖管理 项目构建利器Maven给我们开发人员带来了极大的便利,从繁琐的jar包管理中脱身的程序员终于可以有时间再进入另一个坑了. 我今天要给大家分享的内容是我在实际 ...
- 【转载】Gradle学习 第八章:依赖管理基础
转载地址:http://ask.android-studio.org/?/article/10 This chapter introduces some of the basics of depend ...
- Gradle笔记——依赖管理基础
1. 什么是依赖管理 依赖管理可以分为两部分:一是依赖,即项目构建或运行时所需要的一些文件:二是发布,即构建完成后上传到某个地方. 1.1 依赖 大部分的项目都需要第三方库类或项目文件,这些文件就是项 ...
- 廖雪峰Java12maven基础-1maven入门-2依赖管理
maven 如果我们的项目依赖第三方的jar包: Commons Logging发布的jar包在那里下载? 使用Log4j需要哪些jar包 其他依赖:junit,Javamail,MySQL驱动... ...
- 那些教程没有的php4-composer依赖管理工具
phpcomposer PHP 5.3.2+ Composer 不是一个包管理器,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装.默认情况下它不会在全局安装任何东西 ...
- Composer PHP 依赖管理工具
composer 是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 依赖管理 ...
- Maven 学习总结(三) 之 依赖管理
聚合 为了要一次构建多个项目,而不是到每个模块目录下分别执行mvn命令.maven聚合这一特性就是为该需求服务的.为此我们需要创建一个额外的模块aggregator, 然后通过该模块构建整个项目的所有 ...
- 【系列教程1】Gradle入门系列三:依赖管理
在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极具挑战的.这也是为什么依赖管理对于每个软件项目都是至关重要的一部分. 这篇教程主要讲述如何使用Gradle管理我们项目的依赖,我们 ...
- 有用PHP依赖管理工具Composer新手教程
PHP依赖管理工具Composer新手教程 Composer 是 PHP 的一个依赖管理工具.它同意你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 依赖管理 Composer 不是一个包管理 ...
- golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的
golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...
随机推荐
- Unity的IPostprocessBuild:深入解析与实用案例
Unity IPostprocessBuild技术文章 Unity IPostprocessBuild是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自动执行一些操作.这个功能可以帮 ...
- 【Leaflet专题篇】L.tileLayer图层顺序问题
1 问题复现 使用L.tileLayer加载底图(A.B.C)并使用layerControl管理.在用L.tileLayer.wms添加wms服务(D),当切换ABC时会压盖D视频中右下角的wms服务 ...
- 如何爆破js加密后的密码?
如何爆破js加密后的密码? 1.首先burp中安装插件: https://github.com/whwlsfb/BurpCrypto 安装插件完毕后,分析进行js加密的算法. 2.分析加密过程: 找到 ...
- PHP秒杀面试题
什么是秒杀系统:秒杀系统是一个处理大量并发用户请求的系统,通常用于限时促销或特定活动中,用户可以在特定时间内以抢购的方式购买商品或服务. 秒杀系统可能面临的挑战是什么?秒杀系统可能面临以下挑战: 高并 ...
- 重学JavaScript Promise API
在这篇教程中,我们将掌握如何在JavaScript中创建并使用Promise.我们将了解Promise链式调用.错误处理以及最近添加到语言中的一些Promise静态方法. 什么是Promise? 在J ...
- 通过Nginx权限认证拦截资源
nginx认证转发模块 Module ngx_http_auth_request_module 详细参考官网 ngx_http_auth_request_module (nginx.org) 模块 ...
- Jquery 将 JSON 列表的 某个属性值,添加到数组中,并判断一个值,在不在数据中
jquery 将 JSON 列表的 某个属性值,添加到数组中 如果你有一个JSON列表,并且想要将每个对象的某个属性值添加到数组中,你可以使用jQuery的$.each()函数来遍历JSON列表,并获 ...
- Vue-进阶:路由及elementUI组合开发
Vue-router路由 什么是vue-router? 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果.当我们在一个传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服 ...
- P4032 [Code+#2] 火锅盛宴
prologue 树状数组推荐写法,感谢巨佬樱雪喵的教学. inline int lowbit(int x) { return x & -x; } inline void add(int x, ...
- CF1575I Illusions of the Desert
prologue 还是太菜了,这个 154 行的树剖 20min 才敲完. analysis 首先,处理这个给到我们的这个式子. \[\max(| a _ u + a _ v |, | a _ u - ...