一直以来,我们都在使用并推荐使用dep和retool这两个工具来分别管理依赖关系、软件包和工具。然而,随着Go Modules的正式引入,不幸的是,这两个工具立即被废弃了。
具体来说,我们依赖以下Go工具来生成我们的代码,测试它,对它进行刷新并发布它。
- 衬托者
- 代码生成器
- 测试。
- go-junit-report:用于从Go代码覆盖工件中生成JUnit XML兼容文件。
- gocovermerge:用于合并多个代码覆盖输出。
- migrate:用于数据库迁移。
- go-semrel-gitlab:用于生成Gitlab Releases。
值得庆幸的是,所有这些项目都已经被迁移到Go模块中,所以依赖它们真的很容易。我遵循了推荐的tools.go 范式,并表示是最近的版本,我们没有任何问题。
关于我们的内部私有包,我们必须做的一件重要的事情是使用git config ,以确保go get 在克隆仓库时使用SSH而不是https ,类似下面的内容应该足够了。
git config --global url."git@gitlab.private:".insteadOf "https://gitlab.private/"
除此之外,由于我们使用的是自营的 Gitlab和Gitlab CI实例,而且我们的项目结构是这样的。<project name>/<team>/<service>,我们不得不明确使用go 1.13.3,因为有子项目是个问题。我们需要做的另一件重要的事情是在go.mod 中定义一个replace 指令,明确表示使用.git 黑客的存储库,类似于下面的内容。
require (
private.gitlab.instance/project/team/service-name v1.0.0
)
replace (
private.gitlab.instance/project/team/service-name => private.gitlab.instance/project/team/service-name.git v1.0.0
)
最后,我们引入了 direnv到我们的工作流程中,这样当我们安装我们的工具时,这些工具是与我们正在工作的项目相对应的,一个简单的.envrc ,内容如下即可。
PATH_add bin
export GOBIN=$PWD/bin
在1.13.3之后,迁移到Go模块是一个简单的过程。