沸点阅读打卡文章笔记——新版golang包管理工具|青训营笔记

103 阅读4分钟

根据这篇沸点打卡文章,提出以下几个扩展问题进行学习:

  1. 在新的包管理模式下,如何管理多个版本的依赖包?包的兼容性问题一般要怎么解决?
  2. 如何在新的包管理模式下进行协作开发?
  3. 如果我想在$GOPATH/src$GOPATH/pkg/mod之间切换,我应该如何操作?

下面将对这三个问题进行展开叙述:

新包管理模式

这是个啥?

新包管理模式是 Go 1.11 和 1.12 版本开始实现的对包管理的初步支持,这种新的依赖管理系统使依赖版本信息明确且易于管理。

说人话!

  1. 自动下载依赖包:在新的包管理模式下,Go 的依赖包会自动下载,而在旧的模式下,Go 的依赖包需要手工下载。
  2. 项目位置的灵活性:在新的包管理模式下,项目不必放在 GOPATH/src内,而在旧的模式下,项目需要放在GOPATH/src 内,而在旧的模式下,项目需要放在 GOPATH/src 下。
  3. 依赖包的版本管理:在新的包管理模式下,项目内会生成一个 go.mod 文件,列出包依赖,所有的第三方包会准确的指定版本号。而在旧的模式下,第三方包没有版本的概念,如果第三方包的作者做了不兼容升级,会让开发者很难受。
  4. 包的替换:在新的包管理模式下,对于已经转移的包,可以用 replace 申明替换,不需要改代码。而在旧的模式下,如果引用的包引用了已经转移的包,而作者没改的话,需要自己修改引用。
  5. 源码管理:在新的包管理模式下,第三方包和自己的包的源码分别存放,不会混乱。而在旧的模式下,第三方包和自己的包的源码都在 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命令来查看你当前下载的所有依赖包及其版本

  1. 更新你的依赖包:你可以在go.mod文件中指定新的版本,然后运行go get命令来更新你的依赖包。

go get -u命令来更新你所有的依赖包到最新版本。 go mod tidy命令来删除你不再使用的依赖包。这个命令会检查你的代码中实际使用的依赖包,然后更新go.mod文件,删除那些没有被你的代码使用的依赖包。

  1. 使用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 的功能。

参考资料

juejin.cn/post/684490…