百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

golang 依赖管理

bigegpt 2024-08-24 23:20 3 浏览

Go语言的依赖管理

依赖的概念

依赖管理的三个阶段 GOPATH, GOVENDOR, go mod

GOPATH

默认在~/go(unix, linux), %USERPROFILE%\go(windows)

历史: Google将20亿行代码, 9百万个文件放在一个repo里

> # mkdir /tmp/gopathtest
> # cd /tmp/gopathtest
> # go env
> # export GOPATH=/tmp/gopathtest
> # mkdir src
> # mkdir project1
> # cd project1
> # export GO111MODULE=off
> # echo $GO111MODULE
> # go env

export 只对当前窗口生效, src目录必须存在

https://github.com/uber-go/zap

> # go get -u go.uber.org/zap
> # cd ..
> # ls
go.uber.org project1
package main
import (
"go.uber.org/zap"
)
func main() { //左括号必须和函数名同行
log, _ := zap.NewProduction()
log.Warn("warning test")
}
D:\project\src>go run main.go
{"level":"warn","ts":1587045384.5491102,"caller":"src/main.go:10","msg":"warning test"}

查询GOPATH模式下包从哪里查找

package main
import (
"go.uber.org/zap"
"github.com/aaaa/bbb"
)
func main() { //左括号必须和函数名同行
bbb.N()
log, _ := zap.NewProduction()
log.Warn("warning test")
}
D:\project\src>go run main.go
main.go:5:2: cannot find package "github.com/aaaa/bbb" in any of:
c:\go\src\github.com\aaaa\bbb (from $GOROOT)
D:\project\src\github.com\aaaa\bbb (from $GOPATH)
main.go:4:2: cannot find package "go.uber.org/zap" in any of:
c:\go\src\go.uber.org\zap (from $GOROOT)
D:\project\src\go.uber.org\zap (from $GOPATH)

从上面我们可以看到 包先从c:\go\src(from $GOROOT)查找, 然后从D:\project\src\(from $GOPATH) 查找

go env -w GOPROXY=https://goproxy.io,direct
# Set environment variable allow bypassing the proxy for selected modules
go env -w GOPRIVATE=*.corp.example.com
go env -w GO111MODULE=on

go env -w 命令是 1.13 版才支持的命令, 全局设置

GOVENDOR

每个项目有自己的vendor目录, 存放第三方库

大量第三方依赖管理工具: glide, dep, go dep, ...

目录结构:

D:\project\src\verdor\go.uber.org...
D:\project\src\xiangmu1\verdor\go.uber.org...
D:\project\src\xiangmu1\main.go
D:\project\src\xiangmu2\verdor\go.uber.org...
D:\project\src\xiangmu2\main.go

查询GOVENDOR模式下包从哪里查找

package main
import (
"go.uber.org/zap"
"github.com/aaaa/bbb"
)
func main() { //左括号必须和函数名同行
bbb.N()
log, _ := zap.NewProduction()
log.Warn("warning test")
}
package main
import (
"go.uber.org/zap"
"github.com/aaaa/bbb"
)
func main() { //左括号必须和函数名同行
bbb.N()
log, _ := zap.NewProduction()
log.Warn("warning test")
}
main.go:5:2: cannot find package "github.com/aaaa/bbb" in any of:
D:\project\src\xiangmu1\vendor\github.com\aaaa\bbb (vendor tree)
D:\project\src\vendor\github.com\aaaa\bbb
c:\go\src\github.com\aaaa\bbb (from $GOROOT)
D:\project\src\github.com\aaaa\bbb (from $GOPATH)

从上面我们可以看到 包先从D:\project\src\xiangmu1\vendor(vendor tree)查找, 然后从D:\project\src\vendor\ 查找.....

注意: GOVENDOR模式不需要额外配置, 只是利用GOPATH模式的配置

go mod的使用

设置两个环境变量

GO111MODULE on
GOPROXY https://goproxy.cn
D:\project\src\xiangmu1>go mod init xiangmu1
go: creating new go.mod: module xiangmu1
package main
import (
"go.uber.org/zap"
//"github.com/aaaa/bbb"
)
func main() { //左括号必须和函数名同行
//bbb.N()
log, _ := zap.NewProduction()
log.Warn("warning test")
}
D:\project\src\xiangmu1>go get -u go.uber.org/zap
D:\project\src\xiangmu1>go run main.go
go: finding go.uber.org/zap v1.14.1
go: downloading go.uber.org/zap v1.14.1
go: extracting go.uber.org/zap v1.14.1
go: downloading go.uber.org/multierr v1.5.0
go: downloading go.uber.org/atomic v1.6.0
go: extracting go.uber.org/multierr v1.5.0
go: extracting go.uber.org/atomic v1.6.0
go: finding go.uber.org/atomic v1.6.0
go: finding go.uber.org/multierr v1.5.0
{"level":"warn","ts":1587175300.386373,"caller":"xiangmu1/main.go:11","msg":"warning test"}

查看go.mod文件

module xiangmu1
go 1.13
require go.uber.org/zap v1.14.1 // indirect

查看go.sum文件

github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=

由此可见, go mod 自动通过https://goproxy.cn 国内镜像下载包

存放地址: D:\project\pkg\mod\go.uber.org

下载其他版本的包

D:\project\src\xiangmu1>go get -u go.uber.org/zap@v1.11
go: finding go.uber.org/zap v1.11.0
go: downloading go.uber.org/zap v1.11.0
go: extracting go.uber.org/zap v1.11.0

查看go.mod文件

module xiangmu1
go 1.13
require (
github.com/pkg/errors v0.8.1 // indirect
github.com/stretchr/testify v1.4.0 // indirect
go.uber.org/multierr v1.5.0 // indirect
go.uber.org/zap v1.11.0 // indirect
)

修改go.mod文件 go.uber.org/zap v1.11.0 修改为 go.uber.org/zap v1.12.0

module xiangmu1
go 1.13
require (
github.com/pkg/errors v0.8.1 // indirect
github.com/stretchr/testify v1.4.0 // indirect
go.uber.org/multierr v1.5.0 // indirect
go.uber.org/zap v1.12.0 // indirect
)

清理无用的依赖

go mod tidy

我们发现go.uber.org/zap v1.11.0已经被清理掉了

下载不指定版本

D:\project\src\xiangmu1>go get -u go.uber.org/zap

go.mod文件

module xiangmu1
go 1.13
require (
github.com/pkg/errors v0.9.1 // indirect
go.uber.org/zap v1.14.1
)
main.go
package main
import (
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
func main() { //左括号必须和函数名同行
//bbb.N()
log, _ := zap.NewProduction()
log.Warn("warning test")
gin.N()
}
D:\project\src\xiangmu1>go run main.go
go: finding github.com/gin-gonic/gin v1.6.2
go: downloading github.com/gin-gonic/gin v1.6.2
go: extracting github.com/gin-gonic/gin v1.6.2
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading github.com/golang/protobuf v1.3.3
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading github.com/ugorji/go v1.1.7
go: downloading github.com/go-playground/validator/v10 v10.2.0
go: extracting github.com/gin-contrib/sse v0.1.0
go: extracting github.com/mattn/go-isatty v0.0.12
go: extracting github.com/golang/protobuf v1.3.3
go: extracting gopkg.in/yaml.v2 v2.2.8
go: extracting github.com/ugorji/go v1.1.7
go: downloading github.com/ugorji/go/codec v1.1.7
go: extracting github.com/go-playground/validator/v10 v10.2.0
go: downloading github.com/leodido/go-urn v1.2.0
go: downloading github.com/go-playground/universal-translator v0.17.0
go: extracting github.com/ugorji/go/codec v1.1.7
go: extracting github.com/go-playground/universal-translator v0.17.0
go: downloading github.com/go-playground/locales v0.13.0
go: extracting github.com/leodido/go-urn v1.2.0
go: extracting github.com/go-playground/locales v0.13.0
go: finding github.com/gin-contrib/sse v0.1.0
go: finding github.com/go-playground/validator/v10 v10.2.0
go: finding github.com/go-playground/universal-translator v0.17.0
go: finding github.com/go-playground/locales v0.13.0
go: finding github.com/leodido/go-urn v1.2.0
go: finding github.com/golang/protobuf v1.3.3
go: finding github.com/ugorji/go/codec v1.1.7
go: finding gopkg.in/yaml.v2 v2.2.8
go: finding github.com/mattn/go-isatty v0.0.12
# command-line-arguments
.\main.go:12:2: undefined: gin.N

我们发现 运行 go run main.go 自动帮助我们下载github.com/gin-gonic/gin包

go.mod文件

module xiangmu1
go 1.13
require (
github.com/gin-gonic/gin v1.6.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
go.uber.org/zap v1.14.1
)

拉取所有的依赖库, 项目迁移时要用到(在 执行初始化命令 "go mod init 项目包名称"后执行)

go build ./...
D:\project\src\xiangmu1>go build ./...

go mod 总结

由go命令统一的管理, 用户不必关心目录结构

初始化: go mod init

增加依赖: go get

更新依赖:

go get [@v...]

go mod tidy

项目迁移

go mod init

go build ./...

相关推荐

AI「自我复制」能力曝光,RepliBench警示:大模型正在学会伪造身份

科幻中AI自我复制失控场景,正成为现实世界严肃的研究课题。英国AISI推出RepliBench基准,分解并评估AI自主复制所需的四大核心能力。测试显示,当前AI尚不具备完全自主复制能力,但在获取资源...

【Python第三方库安装】介绍8种情况,这里最全看这里就够了!

**本图文作品主要解决CMD或pycharm终端下载安装第三方库可能出错的问题**本作品介绍了8种安装方法,这里最全的python第三方库安装教程,简单易上手,满满干货!希望大家能愉快地写代码,而不要...

pyvips,一个神奇的 Python 库!(pythonvip视频)

大家好,今天为大家分享一个神奇的Python库-pyvips。在图像处理领域,高效和快速的图像处理工具对于开发者来说至关重要。pyvips是一个强大的Python库,基于libvips...

mac 安装tesseract、pytesseract以及简单使用

一.tesseract-OCR的介绍1.tesseract-OCR是一个开源的OCR引擎,能识别100多种语言,专门用于对图片文字进行识别,并获取文本。但是它的缺点是对手写的识别能力比较差。2.用te...

实测o3/o4-mini:3分钟解决欧拉问题,OpenAI最强模型名副其实!

号称“OpenAI迄今为止最强模型”,o3/o4-mini真实能力究竟如何?就在发布后的几小时内,网友们的第一波实测已新鲜出炉。最强推理模型o3,即使遇上首位全职提示词工程师RileyGoodsid...

使用Python将图片转换为字符画并保存到文件

字符画(ASCIIArt)是将图片转换为由字符组成的艺术作品。利用Python,我们可以轻松实现图片转字符画的功能。本教程将带你一步步实现这个功能,并详细解释每一步的代码和实现原理。环境准备首先,你...

5分钟-python包管理器pip安装(python pip安装包)

pip是一个现代的,通用、普遍的Python包管理工具。提供了对Python包的查找、下载、安装、卸载的功能,是Python开发的基础。第一步:PC端打开网址:选择gz后缀的文件下载第二步:...

网络问题快速排查,你也能当好自己家的网络攻城狮

前面写了一篇关于网络基础和常见故障排查的,只列举了工具。没具体排查方式。这篇重点把几个常用工具的组合讲解一下。先有请今天的主角:nslookup及dig,traceroute,httping,teln...

终于把TCP/IP 协议讲的明明白白了,再也不怕被问三次握手了

文:涤生_Woo下周就开始和大家成体系的讲hadoop了,里面的每一个模块的技术细节我都会涉及到,希望大家会喜欢。当然了你也可以评论或者留言自己喜欢的技术,还是那句话,希望咱们一起进步。今天周五,讲讲...

记一次工控触摸屏故障的处理(工控触摸屏维修)

先说明一下,虽然我是自动化专业毕业,但已经很多年不从事现场一线的工控工作了。但自己在单位做的工作也牵涉到信息化与自动化的整合,所以平时也略有关注。上一周一个朋友接到一个活,一家光伏企业用于启动机组的触...

19、90秒快速“读懂”路由、交换命令行基础

命令行视图VRP分层的命令结构定义了很多命令行视图,每条命令只能在特定的视图中执行。本例介绍了常见的命令行视图。每个命令都注册在一个或多个命令视图下,用户只有先进入这个命令所在的视图,才能运行相应的命...

摄像头没图像的几个检查方法(摄像头没图像怎么修复)

背景描述:安防监控项目上,用户的摄像头运行了一段时间有部分摄像头不能进行预览,需要针对不能预览的摄像头进行排查,下面列出几个常见的排查方法。问题解决:一般情况为网络、供电、设备配置等情况。一,网络检查...

小谈:必需脂肪酸(必需脂肪酸主要包括)

必需脂肪酸是指机体生命活动必不可少,但机体自身又不能合成,必需由食物供给的多不饱和脂肪酸(PUFA)。必需脂肪酸主要包括两种,一种是ω-3系列的α-亚麻酸(18:3),一种是ω-6系列的亚油酸(18:...

期刊推荐:15本sci四区易发表的机械类期刊

  虽然,Sci四区期刊相比收录在sci一区、二区、三区的期刊来说要求不是那么高,投稿起来也相对容易一些。但,sci四区所收录的期刊中每本期刊的投稿难易程度也是不一样的。为方便大家投稿,本文给大家推荐...

be sick of 用法考察(be in lack of的用法)

besick表示病了,做谓语.本身是形容词,有多种意思.最通常的是:生病,恶心,呕吐,不适,晕,厌烦,无法忍受asickchild生病的孩子Hermother'sverysi...