根据这篇沸点打卡文章,提出以下几个扩展问题进行学习:
- 在新的包管理模式下,如何管理多个版本的依赖包?包的兼容性问题一般要怎么解决?
- 如何在新的包管理模式下进行协作开发?
- 如果我想在
$GOPATH/src和$GOPATH/pkg/mod之间切换,我应该如何操作?
下面将对这三个问题进行展开叙述:
新包管理模式
这是个啥?
新包管理模式是 Go 1.11 和 1.12 版本开始实现的对包管理的初步支持,这种新的依赖管理系统使依赖版本信息明确且易于管理。
说人话!
- 自动下载依赖包:在新的包管理模式下,Go 的依赖包会自动下载,而在旧的模式下,Go 的依赖包需要手工下载。
- 项目位置的灵活性:在新的包管理模式下,项目不必放在 GOPATH/src 下。
- 依赖包的版本管理:在新的包管理模式下,项目内会生成一个 go.mod 文件,列出包依赖,所有的第三方包会准确的指定版本号。而在旧的模式下,第三方包没有版本的概念,如果第三方包的作者做了不兼容升级,会让开发者很难受。
- 包的替换:在新的包管理模式下,对于已经转移的包,可以用 replace 申明替换,不需要改代码。而在旧的模式下,如果引用的包引用了已经转移的包,而作者没改的话,需要自己修改引用。
- 源码管理:在新的包管理模式下,第三方包和自己的包的源码分别存放,不会混乱。而在旧的模式下,第三方包和自己的包的源码都在 src 下,很混乱。
????? EXM????
所以就是很强是吧?你是个成熟的包管理工具了,知道自己下包管包分门别类活好不黏人了的意思吧!
如何在新的包管理模式下进行协作开发?
有go.mod直接冲就完了!
但是,go.mod要怎么指定项目依赖呢?
如何管理多个版本的依赖包?
go list -m all命令来查看你当前下载的所有依赖包及其版本
在Go的新包管理模式下,依赖包的版本是通过go.mod文件来管理的。在go.mod文件中,你可以通过require关键字来指定你的项目依赖哪些包以及依赖的版本。例如,如果你的项目依赖了beego包,并且你希望使用v1.11.1版本,你可以在go.mod文件中添加如下内容:
require github.com/astaxie/beego v1.11.1
这样,当你运行你的项目时,Go会自动下载并使用v1.11.1版本的beego包。如果你的项目需要使用beego包的不同版本,你可以在go.mod文件中指定不同的版本。
包的兼容性问题又应该如何解决?
go list -m all命令来查看你当前下载的所有依赖包及其版本
- 更新你的依赖包:你可以在go.mod文件中指定新的版本,然后运行go get命令来更新你的依赖包。
go get -u命令来更新你所有的依赖包到最新版本。
go mod tidy命令来删除你不再使用的依赖包。这个命令会检查你的代码中实际使用的依赖包,然后更新go.mod文件,删除那些没有被你的代码使用的依赖包。
- 使用replace指令:如果你不能更新你的依赖包,或者你需要使用一个修复了兼容性问题的包的fork版本,你可以在go.mod文件中使用replace指令来替换你的依赖包。例如,你可以使用如下的replace指令来替换你的依赖包:
replace github.com/old/package v1.0.0 => github.com/new/package v2.0.0
这样,当你的代码引用github.com/old/package包时,Go会使用github.com/new/package v2.0.0版本的包。
我学废了!!! (不你根本不用学吧,毕竟新的包管理模式已经帮你省了一堆事了呢!)
新旧切换
在 Go 语言中,$GOPATH/src 和 $GOPATH/pkg/mod 是两个用于存放 Go 项目和依赖包的重要目录。在 Go 1.11 之前,所有的 Go 项目和依赖包都需要放在 $GOPATH/src 目录下。但是从 Go 1.11 开始,Go 语言引入了新的包管理工具 Go Modules,这使得 Go 项目可以放在任何地方,而不仅仅是 $GOPATH/src 目录下。同时,Go Modules 会把下载的依赖包存放在 $GOPATH/pkg/mod 目录下。
在某些情况下,你可能需要在 $GOPATH/src 和 $GOPATH/pkg/mod 之间切换。例如,如果你正在使用 Go Modules,但是你需要使用一些还没有适配 Go Modules 的工具或库,那么你可能需要把你的项目放在 $GOPATH/src 目录下。反之,如果你的项目在 $GOPATH/src 目录下,但是你想使用 Go Modules 来管理你的依赖包,那么你可能需要把你的项目移出 $GOPATH/src 目录。
在$GOPATH/src和$GOPATH/pkg/mod之间切换
从 $GOPATH/src 移到 $GOPATH/pkg/mod
你可以先在你的项目目录下运行 go mod init 命令来初始化一个新的 Go Modules 项目,然后把你的项目目录移动到你想要的位置。
从 $GOPATH/pkg/mod 移到 $GOPATH/src
你只需要把你的项目目录移动到 $GOPATH/src 下即可。但是请注意,如果你的项目使用了 Go Modules,那么在 $GOPATH/src 下你可能无法正常使用 Go Modules 的功能。