Skip to content

09 go mod

Jinxin Chen edited this page Feb 17, 2020 · 1 revision

本文介绍go module相关知识

简介

从1.11版本开始,golang加入了module 功能,开始支持 package 依赖及版本管理。

要想启用此功能,在项目的根目录下,运行命令

go mod init

这个命令会在根目录生成2个文件:

  • go.mod
  • go.sum
# go.mod
module example.com/hello

go 1.12

添加 package

添加package有2种方式,一种是直接在go文件中 import package,第二种是用 go get 命令。

第一种方式,对于import的package,如果没有在go mod中声明时,在 go build(等) 时系统会自动查找 package 并加入到 go mod 中

升级 package

升级 minor version:

go get [package url]

升级 major version:

go get [package url@v[major version]]

在升级之前,可以用 go doc 指令,查看该版本的文档

go doc [package url@v[major version]]

移除不必要的 package

在项目开发过程中,依赖的 package 可能会不断的变化,有的也会不再使用。

go mod tidy 指令可以移除项目中没有使用到的 package,注意,有些 package 并不是项目显示引用,而是其他的 package 间接引用的,这些 package 会在 go.mod 文件中加上 // indirect 注释

总结

  • go mod init creates a new module, initializing the go.mod file that describes it.
  • go build, go test, and other package-building commands add new dependencies to go.mod as needed.
  • go list -m all prints the current module’s dependencies.
  • go get changes the required version of a dependency (or adds a new dependency).
  • go mod tidy removes unused dependencies.

发布你自己的 module

在发布自己的 module 之前,需要先了解 semantic version 相关知识

  • v0: the initial, unstable version
  • v1: the first stable version

通过 tag 可以发布对应版本的 package,比如下面的指令发布了 v1.0.0 版本的 package

$ git tag v1.0.0
$ git push origin v1.0.0

可以通过如下命令确认版本是否可用,如果使用了go proxy,则可能需要等待一段时间,其同步之后才可用。

go list -m example.com/[email protected]

发布 v2 版本

在发布 v2 版本之前,首先需了解:

  1. v0主要版本和预发行版本不保证向后兼容。它们使您可以在对用户做出稳定性承诺之前优化API。但是,v1主要版本及更高版本要求该主要版本内的向后兼容性。
  2. 不要从您的仓库中删除版本标签。如果发现某个版本的错误或安全问题,请发布新版本。如果人们依赖于您已删除的版本,则其构建可能会失败。同样,发布版本后,请勿更改或覆盖版本。
  3. 一旦确定模块的API稳定之后,就可以发布 v1.0.0。如果对API进行了更改,则它们将向后兼容(例如,向结构添加新字段),并将包含在新的次要版本中。如果存在错误修复程序(例如,安全修复程序),它们将包含在补丁程序发行版中(或作为次要发行版的一部分)。有时,保持向后兼容性可能会导致API笨拙。没关系。不完善的API比破坏用户的现有代码更好。
  4. 升级主要版本之前,需要衡量利弊。 更改会导致开发和维护开销,并且需要下游用户的投资才能进行迁移。项目越大,这些开销往往越大。只有在确定了令人信服的理由之后,才进行主要版本更改。一旦确定了令人震惊的重大变更原因,我们建议在master分支中开发多个主要版本,因为它与各种现有工具兼容。

golang从v2版本开始,需要在根目录建立v2,v3...等子目录,并在该目录下有完整的代码,步骤如下:

  1. 新建目录v2
  2. 将所有项目相关文件复制到v2目录中,包含go.mod
  3. 修改v2目录中的package地址,将原有的地址(比如github.com/googleapis/gax-go)修改为(github.com/googleapis/gax-go/v2)
  4. 打测试tag
    1. git tag v2.0.0-alpha.1
    2. git push origin v2.0.0-alpha.1
  5. 确认无误后,打正式tag
    1. git tag v2.0.0
    2. git push origin v2.0.0

参考

Clone this wiki locally