原文地址

Go Modules 是 Go 管理的未来方向。已经在 Go 1.11 中可以试用,将会是 Go 1.13 中的默认行为。

我不会在这篇文章中描述包管理工具的工作流程。我会主要讨论的是如何把现有的项目中 dep 迁移的 Go Module。

在我的实例中,我会使用一个私有的仓库地址 github.com/kuinta/luigi ,它是使用 Go 语言编写,在好几个项目中被使用,是一个绝佳的候选人。

首先,我们需要初始化 Module:

cd github.com/kounta/luigi
go mod init github.com/kounta/luigi

完成后只会有两行输出:

go: create now go.mod: module github.com/kounta/luigi
go: copying requirments from Gopkg.lock

是的,这样就对了。这样就已经完成从 dep 迁移了。

现在你只要看一眼新生成的文件 go.mod 就像下面这样:

module github.com/kounta/luigi

go 1.12

require (
   github.com/elliotchance/tf v1.5.0
   github.com/gin-gonic/gin v1.3.0
   github.com/go-redis/redis v6.15.0+incompatible
)

其实在 require 中还有更多的内容,为了保持整洁我把他们删除了。

就像 dep 区分 tomllock 文件一样。我们需要生成 go.sum 文件,只要执行:

go build

现在你可以删除 Gopkg.lockGopkg.toml 文件,然后提交 go.modgo.sum 文件。

Travis CI

如果你使用 Travis CI,你需要在 Go 1.13 之前通过设置环境变量来启用该功能。

GO111MODULE=on

私有仓库

如果你要导入私有仓库,你可以会发现这个错误:

invalid module version "v6.5.0": unknown revision v6.5.0

这是一个误导。它真正想说的,无法识别这个 URL (在这里是指的是 github.com)。无法找到这个仓库是因为 Github 没有权限确认仓库的存在。

修复这个问题也很简单:

  1. 登录 Github 账号,然后到 Setting -> Personal access tokens
  2. 创建一个有访问私有仓库权限的 token
  3. 然后执行
export GITHUB_TOKEN=xxx

git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/kounta".insteadOf "https://github.com/kounta"