声明,本文是对 Migrating to go mod in just 3 steps 的翻译,并加上了一些自己的文字
好久没有跟 Go 语言 相关的任何文章了。一方面最近实在没空,另一方面,Go 语言最近动作比较少,唯一的更新还是比较小的 bug 修复的更新。
go mods 出来已经好久了,想必大家都用上了吧? 会用了么?
在这个帖子中,我并不打算枚举列出使用 go modules 进行依赖管理的好处,因为互联网上有很多帖子,因为我之前也已经介绍过了,更因为,这个是一个必然的选择。
我们今天来聊聊另一个话题,如何把旧的项目迁移到新的 go mods 解决方案上。
迁移看起来很复杂,但如果你对 go mods 比较熟悉,迁移过程还是比较简单的。小编在这里归纳下,总的来说,就是简单三步
安装最新的 Golang 版本
你可能会有疑问,为什么需要安装最新的版本?
这是因为我们都是软件爱好者,我们应该希望测试最新技术
顺便说一句,你可以使用 golang 1.11.X,但你应该想知道为什么不使用最新版本...
为此,你可以访问我们的 Go 语言环境配置 并安装最新的 1.11.2 版本
找到一个需要迁移到 go modules 的旧项目
我们以一个不久前才完成的一个个人的旧项目 mollydb 为例,介绍如何迁移到 go modules 。
在这个旧项目中,我使用了 Glide 来管理依赖
你不必纠结于具体项目,实际上我们介绍的方法适用于任何项目
这个项目看起来有点庞大,但实际上,你不要担心不理解 mollydb 的功能和作用,因为我们只需要了解如何迁移现有项目即可。
你可以在命令行或 shell 中运行下面的命令来拉取和迁出项目
git clone https://github.com/wesovilabs/mollydb.git cd mollydb; git checkout -b feature/using-go-mods
调整项目结构
首先要做的,就是调整现有的项目结构。当前的目录结构如下
src > mollydb > vendors
简单来说,就是
-
所有 Go 语言源代码都放在
src
目录中 -
src
目录包含两个子目录,一个是我们的项目目录mollydb
、另一个是相关工具目录tools
ls src mollydb tools
-
mollydb
目录下包含了第三方依赖,这些依赖都放在vendors
目录中,并以每一个依赖的提供商进行分类ls src/mollydb/vendor github.com golang.org gopkg.in
在旧的 GOPATH 模式下,这种目录结构是唯一可以摆脱 GOPATH 依赖的方式。
但在新的 go modules 模式下,这种结构肯定是不适合的,也没必要。
而我们所要做的,就是移除 src/mollydb/vendor
目录,并把 src/mollydb
目录下的所有内容移到项目的跟目录
相关的命令如下
rm -rf src/mollydb/vendor mv src/mollydb/* .
然后,我们接下来要做的就是运行 go mod init mollydb
来初始化 go modules 配置文件
这个命令足够智能,它会自动帮我们将 glide.lock
中的依赖项复制到 go.mod
文件中,并下载它们
go mod init mollydb go: creating new go.mod: module mollydb go: copying requirements from glide.lock
万恶的长城,我本地安装依赖失败了...不过没关系,你影响本文接下来的部分
然后,我们就可以看到 go.mod
文件中的内容如下
module mollydb require ( github.com/boltdb/bolt v0.0.0–20180302180052-fd01fc79c553 github.com/fsnotify/fsnotify v1.4.7 github.com/go-yaml/yaml v0.0.0–20140922213225-bec87e4332ae github.com/graphql-go/graphql v0.0.0–20180324214652–8ab5400ff77c github.com/graphql-go/handler v0.0.0–20180312211735-df717460db9a github.com/graphql-go/relay v0.0.0–20171208134043–54350098cfe5 golang.org/x/net v0.0.0–20180320002117–6078986fec03 golang.org/x/sys v0.0.0–20180318190847–01acb38716e0 gopkg.in/yaml.v2 v2.1.1 )
接着,我们就可以删除任何跟 glide
相关的内容,并且执行下面的命令来清理下项目,删除不必要的垃圾文件
go mod init mollydb go mod tidy
上面这些命令会导致 go.mod
文件被重新创建,因为 go mod
命令会检查我们的 Go 源文件,并从源文件中找到依赖项并安装它们
module mollydb require ( github.com/fsnotify/fsnotify v1.4.7 github.com/go-chi/chi v3.3.3+incompatible github.com/graphql-go/graphql v0.7.7 github.com/graphql-go/handler v0.2.2 github.com/graphql-go/relay v0.0.0–20171208134043–54350098cfe5 github.com/kr/pretty v0.1.0 // indirect github.com/sirupsen/logrus v1.2.0 github.com/stretchr/testify v1.2.2 golang.org/x/net v0.0.0–20181217023233-e147a9138326 // indirect golang.org/x/text v0.3.0 // indirect gopkg.in/yaml.v2 v2.2.2 )
最后,我们可以运行下面的命令来检查项目迁移是否成功
go run main.go
不出意外,一切都很顺利的。
怎么样? 迁移看起来是不是很简单?