1.go module 常用操作详解
2.golang 系列: go mod 使用
3.go进阶1-go mod使用入门
4.开始使用 Go Module
5.Go 佳库面面观
6.Go. command not found: govendor.
go module 常用操作详解
Go Module 常用操作详解
一. GO 设置代理
1.1 打开模块支持
1.2 取消代理
1.3 关闭包的源码有效性验证
1.4 设置不走 proxy 的私有仓库或组,多个用逗号相隔(可选)
1.5 设置代理,源码如“direct”用于指示 Go 回源到模块版本的源码源地址,官方全球代理,源码七牛云,源码阿里云,源码php外贸商城源码中山GoCenter,源码百度等。源码
1.5.1 国内常用代理列表
二. 设置 GOMODULE
设置环境变量 GOMODULE 可以开启或关闭模块支持,源码默认值是源码 auto。
三. godep 基本使用
godep 是源码通过vender模式实现的第三方依赖管理工具。
3.1 安装
3.2 基本命令
3.3 使用godep
3.4 vender机制
四. Go module 常用操作
4.1 初始化项目
4.2 升级 / 降级版本
4.3 删除未使用的源码依赖
4.4 引入主版本号大于 1 的三方库
4.5 升级依赖版本到一个不兼容版本
4.6 特殊情况:使用 vendor
五. Go module 常用命令总结
5.1 go mod命令
5.2 go get命令
5.3 go mod edit格式化
六. 项目中使用 Go module
对已有项目启用 Go module 的步骤。
新项目创建步骤。源码
参考资料
golang 系列: go mod 使用
作为官方的源码包依赖管理工具 gomod,已经被广泛应用于各个开源项目中。源码自从有了它,开发者在包管理问题上有了更简便、高效的方式。下面,我们将深入探讨gomod的产生背景、使用方法及一些使用技巧,以便更好地理解和掌握这个工具。
在进行程序开发时,我们经常会引用第三方开源框架提供的方法。过去,开发者会通过go get命令下载到本地的GOPATH目录,并在需要使用时进行查找。然而,这种方式存在一个问题,即不同时间点下载的代码版本可能不同,这增加了维护成本,每次升级需要手动删除并重新引用。特别是当使用docker或k8s等需要重新构建环境的发布方式时,要特别注意版本一致性问题,以防出现破坏性变更。此时,gomod应运而生,通过在go.mod文件中记录当前项目中所有依赖包的git仓库地址和版本号,简化了包依赖管理,确保构建时能获取到特定版本的依赖包。
创建gomod文件的命令为go mod init 项目名。以项目名为manage为例,执行该命令后会在当前项目目录下生成go.mod文件。为了方便外部项目引用,建议使用与git仓库命名一致的方式。依赖包版本生成方面,可以通过go mod tidy或go mod edit命令获取。go mod tidy命令会扫描所有导入的包,并将版本信息记录到go.mod文件中。go mod edit命令则允许指定特定版本或分支进行记录。此外,go.mod文件还包含了一个用于记录依赖包哈希值的温州桶装水防伪溯源码厂家gosum文件,确保部署环境中的包与本地一致。
在使用gomod文件时,有一些技巧可以帮助开发者更灵活地管理依赖。例如,引用分支的包时,可以手动修改go.mod文件以指向特定分支,从而在构建时获取该分支的最新代码。引用本地开发代码时,使用特定命令可以在构建过程中直接引用本地版本,待联调完成后提交至仓库。查看历史版本功能允许开发者导入特定版本的依赖包,而无需每次都拉取最新版本。
除了基础命令,还有一些其他有用的命令,如go list -m all命令可列出当前项目及所有依赖包,go mod vendor命令则将依赖包生成到当前项目的vendor目录下,方便本地开发和版本管理。需要注意的是,手动添加到go.mod文件但实际未使用的依赖包,在执行go mod tidy构建时会被自动删除。
总的来说,gomod的使用非常简单,通过go mod init和go mod tidy等命令即可解决大部分依赖问题。这一工具的简洁、优雅使其成为Go官方推荐的最佳实践。如果您对相关技术感兴趣,不妨关注公众号「阅新技术」,获取更多技术推送。在使用过程中,您的点赞、留言和分享都是对我们极大的支持。阅新技术,旨在分享更多新知识,期待与您的互动。
go进阶1-go mod使用入门
最近在梳理项目,排查隐患。有个go的核心项目一直使用的最传统的go path方式管理方式。是手动管理依赖的。这样不太合理。
首先vendor太大了,M。其次,更重要的是依赖包没有版本控制,之前一直是我一个人在开发,后续如果多人开发就是个隐患。现计划升级成 go mod包管理。这里把涉及的知识点做一下汇总。
go modules 是 golang 1. 新加的特性。modules的官方定义如下:
现在的方式是将开源的最新代码通过 go get 下载到本地的GOPATH 目录,然后需要时就去对应的 GOPATH 目录去查找了。这就不可避免带来一个问题,保健品溯源码长啥样开源库总会升级,不同时间点下载的代码可能不一样。每次升级都要删除后重新引用,也增加了运维成本。
而go mod管理只需要一个go.mod文件即可。它通过在 go.mod 这个文件里记录了当前项目里所有依赖包的 git 仓库地址以及对应的版本号,来解决了包依赖管理的问题,后续在构建编译时,就会根据对应的版本号去拉取依赖包。也就是说只要我们维护了 gomod 文件,依赖问题就不再是问题了。
GOMODULE 参数
GOMODULE 有三个值:off, on和auto(默认值)
GOMODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GOMODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GOMODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。如果有 go.mod 文件就启用。
下面设置go mod和go proxy
配置完如下
初始化 go.mod 文件
查看 go.mod 内容如下
现在把这个 module 发布到github上,然后在别的项目中引用
在github上创建一个空仓库
项目上传到上述仓库(假设你已经完成本地ssh key到github)
执行完上面,相当于发布完成了。后续有人想用就可以直接 require 。
但这时候还没有加tag,所以没有版本管理。使用 tag 进行版本控制。
操作完,我们的module就发布了一个v1.0.0的版本了。
tag是点,不可移动。branch是由点组成的线。后续可以基于某tag标签 checkout 一个版本,进行修改。不要在master上修改。
主项目引用远程module
代码写好了,生成 go.mod 文件。
查看 go.mod
接下来就是享受 go.mod 便利的时候。一键操作。
1),将引用的开源包下载到 GOPSTH/pkg/mod 目录
2),同时生成了 gp.sum 。
go.mod: 可以理解为包管理文件。
go.sum: 可以理解为包的版本控制文件。更准确地来说,go.sum是一个构建状态跟踪文件。
接下来可以直接运行了。
假如fix一个bug,我们在v1.0.0 版本上进行修复。如 gonow@v1.0.0 => gonow@v1.0.1 。更新引用包的版本:
修改 go.mod ,然后再次 go mod tidy 即可。会自动下载对应版本的通达信上涨波段副图源码开源包。非常方便。
上述就是go mod 的完整使用过程。go mod init、go mod tidy,基本就能解决很多依赖问题了。这也是 Go 官方一直提倡的简洁、优雅。
开始使用 Go Module
Go 的包管理方式经历了从 monorepo 到 vendor 包模式的演变,最终在 v1. 中引入了官方包管理形式 Go Module,简称 gomod。然而,在 v1. 和 v1. 版本中,直接使用 gomod 是不可行的。为了判断是否开启了 gomod,可以使用 go env 命令查看 GOMOD 字段,如果没有开启,可以通过设置环境变量 export GOMODULE=on 来开启。
目前 gomod 在 Go v1. 版本中功能基本稳定,从下一个版本 v1. 开始将默认开启。现在是时候开始在项目中使用 gomod 了。
为了说明 gomod 的使用,我们可以参考 Go 维护者 Russ Cox 的一个简单库。首先,在个人包命名空间目录中新建一个文件夹,使用 go mod init 命令即可。此时,目录内会自动生成 go.mod 文件,其中包含当前模块的名称和 go 的使用版本,类似于 npm package.json 中的 name 和 engine 字段。
在项目中,我们可以新建一个 main.go 文件,并在其中引用如 rsc.io/quote 包。在 gomod 模式下,如果没有此依赖,系统会自动下载。如果包含 golang.org 下的包,需要设置代理。此时,除了 go.mod 文件外,还会生成一个 go.sum 文件,类似于 npm package-lock.json,用于保存依赖的哈希值。
除了 go run 命令外,go build、go test 等命令同样能够自动下载相关依赖包。通过 go mod download 命令可以安装所有依赖。
升级依赖版本可以使用如下命令:查看所有需要升级的版本,升级次级或补丁版本号,仅升级补丁版本号,或使用比较运算符控制升降级版本号。
移除依赖包时,通达信神龙出海副图源码需要使用 go mod edit --droprequire=path 命令来手动移出。运行 go mod edit --require=path 可以更新 go.mod 文件的内容。
查看依赖包信息可以通过 go.mod 文件或命令行操作。如果需要格式化 go.mod 文件,可以使用相应的命令进行文本格式化。
发布版本时,需要在 go.mod 文件中写入相应的版本号,并打上标签。为了避免混淆,建议在版本控制分支中进行发布,如创建一个 v2 分支。同时,发布时可以将依赖包放在新的文件夹内,以避免版本冲突。
当从第三方包管理工具迁移至 gomod 时,只需运行 go mod init 即可。对于没有使用第三方包管理工具的项目,需要先运行 go mod init 初始化,并使用 go get ./... 命令下载所有依赖包,同时更新 go.mod 和 go.sum 文件。
关于 Go Module 的引入及其替代其他包管理工具的过程,有兴趣的读者可以阅读相关文章了解更多细节。
Go 佳库面面观
本文列出从一个好的 Go 库里,我希望得到的东西的一个简短清单。
使用 git 标签来管理库版本,语义版本化是合理的选择,若不赞同语义版本化,本文非你所寻。
避免依赖非标准库,若无法避免,尽量将其抽象到自定义包,以便用户轻松替换。
避免使用 vendor 管理依赖,明确复制确切实现,使测试一致运行。
确保 API 无全局可变状态,空对象行为合理,读操作一致,避免构造器函数。
库应简单,限制公共函数数量,使用小接口,接受接口返回结构。
在运行时可变配置时,提供重新初始化方式,允许用户自定义配置。
优化 API 调用,最小化 GC 操作,避免导入后产生全局副作用。
避免使用 context.Value 和复杂 init 逻辑,允许用户注入全局依赖,检查并处理所有错误。
暴露行为错误,避免 panic,避免创建 goroutine,提供 goroutine 停止方式。
避免使用 channel,使用 context 控制并发,允许用户自定义并发行为。
公开 API 统计信息,使用 expvar 允许用户调试应用使用方式,提供调试或跟踪方法。
实现合理的 Stringer,提供日志接口,代码整洁通过 gometalinter 检查,确保所有函数有测试覆盖率。
避免在结构中拆分函数,使用 /internal 隐藏不打算导入的公共函数,明确用户导入哪些包。
Go. command not found: govendor.
bash: command not found: govendor
zsh:
æ¯å 为没ææ $GOPATH/bin å å ¥ PATH ä¸, å¨èªå·±ä½¿ç¨çbashä¸å å ¥ï¼👇ï¼å ³éï¼ç¶åæ§è¡ source .zshrc(èªå·±ä½¿ç¨çbash)
Go早期的那些布道者
Go语言自年开源以来,已步入第个年头。在这漫长的岁月里,许多关键人物以其独到的见解和不懈的努力,将Go语言推向了成功的巅峰,成为众多开发者首选的编程语言。这些早期的布道者和鼓吹者,不仅为Go语言的发展奠定了坚实的基础,更是推动了整个Go社区的繁荣。
Rob Pike,Go语言的共同创始人之一,以其深厚的技术底蕴和对简洁、并发和高效原则的坚持,对Go语言的核心特性和设计规范产生了深远影响。Pike不仅在Go语言的初期阶段主导了规范制定和关键特性开发,还以其生动有趣的演讲和丰富多样的技术文档,为开发者们提供了一条通往Go的快速通道。他撰写的“3 Day Go Course”和为Go语言的发展做出的贡献,至今仍被广泛引用和学习。退休后,Pike虽不再频繁参与社区活动,但其影响力依旧深远,对Go 1.中泛型的发布策略提供关键性指导。
Robert Griesemer,另一位Go语言的共同创始人,凭借丰富的编程语言设计和实现经验,对Go语言的语法和编译器开发贡献巨大。他致力于简化语言设计,使Go语言易于学习和使用,同时优化编译器性能,确保Go程序在各种平台上的高效运行。Griesemer的演讲和文章深入浅出,为开发者提供了宝贵的实践指南,推动了Go语言的普及。尽管Griesemer如今主要在Google工作,但他的工作对Go语言的成功起到了关键作用,使其成为多领域首选的开发语言。
Brad Fitzpatrick,凭借创建LiveJournal和Memcached的成就,后来成为Go团队的重要成员,为Go语言的网络库和并发编程模型做出了突出贡献。他创建的核心库,如HTTP包和context包,广泛应用于Go的网络编程中。Fitzpatrick积极参与社区活动,通过演讲、博客文章和社区会议,推动了Go语言的发展。即使离开Google后,他通过创建Tailscale等项目继续为Go社区和开源项目做贡献。
Andrew Gerrand,Go团队的早期成员之一,不仅为Go语言构建社区并管理开源项目做出了贡献,还编写了深入浅出的技术文档,创建了Go Playground,方便开发者上手。Gerrand组织的会议和用户组活动,以及他在Go团队的影响力,使得他成为Rob Pike的得力助手。虽然他目前的活动范围有所缩小,但仍活跃于upspin、deps.dev等项目中。
Russ Cox,Go语言团队的另一位核心成员,对语言特性和工具链的贡献,以及社区推广活动,使得他在技术社区中声名鹊起。他主导的vendor、type alias、Go module和泛型设计,引领了Go语言的演进。作为Go语言的第二代****,Russ Cox在GopherCon大会上的主旨演讲,以及他在博客上分享的Go语言演进思路,对Go社区产生了深远影响。
Dmitry Vyukov,英特尔并行编程黑带级程序员,虽然不是Go团队成员,但其在并发无锁算法、执行跟踪和竞争检测工具、fuzzing工具等领域的贡献,对Go语言的性能优化起到了关键作用。虽然参与会议和社区活动的频率不高,但Vyukov的贡献对Go社区的开发者来说至关重要。
Steve Francia,早起Go语言社区的重要成员,以其开发和维护的goHugo、Cobra和viper等项目,以及GopherCon大会的组织和推动,对Go语言的普及和社区建设做出了重要贡献。虽然离开Google后,他的参与度有所下降,但其开源项目仍活跃在Go社区中。
Jaana Dogan,Go语言团队中唯一的女性程序员,以其深入的技术见解和社区活动的贡献,展示了Go语言的多元化和包容性。尽管在Go团队的工作时间不长,但她在诊断技术文档和开源项目上的贡献,对Go社区产生了积极影响。
Brian Ketelsen和Erik St. Martin,共同创立了GopherCon,这是全球最大的Go语言开发者大会,为Go社区提供了一个技术交流和聚会的平台。他们不仅在会议组织和社区活动上展现了对Go语言的热情,还与William Kennedy合作撰写了《Go in Action》一书,提供了系统的学习资源。
Francesc Campoy,Go语言社区的知名讲师和布道者,以其高质量的Go语言视频教程和官方YouTube频道的运营,推动了Go语言的普及。离开Google后,Campoy在Dgraph Labs和Apple的贡献,继续丰富了Go社区的资源。
David Cheney,以其博客、社区活动和开源项目的贡献,成为了Go语言社区的资深开发者和意见领袖。虽然博客更新频率有所下降,但Cheney依然活跃在代码开发中,为Go社区做出了持续贡献。
Bill Kennedy,Go语言社区的知名讲师和布道者,以其Ultimate Go培训、博客文章和多本技术书籍的撰写,帮助众多开发者快速上手Go语言。他的公开信和与Go团队的沟通,展示了他对Go语言演进的积极影响。
Mat Ryer,通过主持Go Time播客和撰写《Go Programming Blueprints》一书,成为了Go社区的活跃开发者和布道者。尽管活动范围有所缩小,但Ryer的贡献仍然为Go社区提供了宝贵的学习资源和交流平台。
这些早期的Go语言布道者和鼓吹者,通过他们的努力,不仅推动了Go语言的发展,更塑造了Go社区的文化和生态。他们的贡献不仅体现在技术层面,更体现在对开发者社区的积极影响上,为Go语言的成功奠定了坚实的基础。在Go语言的旅程中,他们的名字将永远被铭记,成为Go社区的宝贵财富。
Go语言基础:Go Modules依赖管理
Go语言基础:Go Modules依赖管理
在Go项目开发中,依赖包管理至关重要,对编译成功至关重要。本文将深入介绍Go的官方推荐依赖管理工具Go Modules。 首先,回顾一下Go包管理的发展历程。Go推出后,由于缺乏统一方案,出现了多种包管理工具,导致混乱。以下是Go包管理工具的演变过程:Go1.5之前:依赖于GOPATH,限制了包的版本管理和管理复杂性。
Go1.5引入vendor机制,解决了多GOPATH问题,但随着项目规模扩大,vendor目录过大成为问题。
Golang官方在Go1.后推出了Go Modules,这是对vgo的演进,标志着包管理的官方统一。
在Go1.及以后,Go Modules被强烈推荐在生产环境中使用。它基于模块和go mod命令行工具,以及go.mod和go.sum这两个关键文件。go.mod定义了模块名称和依赖,go.sum则用于依赖的校验。 Go包和模块的关系类似集合和元素,一个模块可以包含多个包。通过go mod命令,可以管理这些模块和包的依赖。开启Go Modules时,需设置环境变量GOMODULE,确保其为on状态。go.mod文件中的module、require、replace和exclude语句定义了包的依赖关系。 go.sum文件记录了每个依赖的哈希值,确保在构建时依赖的正确性。在使用Go Modules时,不在GOPATH目录下也能正常初始化和运行项目,这是Go Modules的一大优势。 总结来说,Go Modules为Go项目开发提供了稳定和官方的依赖管理解决方案,go.mod和go.sum的使用是关键。在项目开发中,明智的选择是采用Go Modules和go mod命令来管理依赖,提升开发效率和代码管理的清晰度。GOPATH、Go Vendor、Go Modules的来龙去脉,我想这篇文章足够了吧!
通过本文,你将深入了解GOPATH、Go Vendor和Go Modules的使用和对比。阅读后,你将掌握以下内容:GOPATH的使用方法、缺点以及如何配置环境变量。
Go Vendor的出现背景,以及它如何解决GOPATH的问题,包括依赖管理和版本控制的局限性。
Go Modules的详细使用,包括其在项目管理、依赖下载和版本控制方面的改进。
go install、go get、go mod等常见命令的用法和注意事项。
环境变量如GOPATH、GOROOT、GOBIN、GOPRIVATE的含义和设置方法。
在Go语言的发展历程中,GOPATH曾是主流的项目管理方式,但因存在缺陷,Go1.后引入了Go Modules,它允许项目创建在任意目录,解决了GOPATH的混乱问题。 熟悉Go Modules之前,先要理解GOPATH的配置和缺点,比如src目录对项目结构的要求,以及go install如何生成可执行文件和.a文件。同时,Go Vendor虽然解决了多版本控制问题,但也带来了冗余和不便重用的挑战。 本文还涵盖了如何开启和使用Go Modules,以及如何设置代理和私有库。最后,介绍了Go Modules在项目打包和部署中的应用,以及与go run、go get和go env等命令的差异。