Go module快速上手

Go的包管理方式的演进

  1. 最初的go所有的包都放在GOPATH的目录下,采用namespace的方式来区分包路径
  2. 从go1.5开始引入了vendor的包管理模式,项目中存在vendor目录的话,go的工具链会优先使用vendor下的包进行编译,govendor, go dep等社区的包管理工具就是通过这种方式实现的
  3. go1.11开始,官方推出了go module作为官方的包管理方式,最初的Go module提案是vgo,不过gomod在go v11跟v12版本并不是默认打开的,需要通过环境变量来启用

Go module概念

go module抛弃了GOPATH的管理方式,引入了 模块(module)概念,一个Go模块是一组包(package)的集合,它们有着共同的版本信息, 模块里记录了准确的依赖关心信息,可以被重复的构建

一个模块在go项目中的根目录上生成go.mod文件,go.mod包含四个指令 module, require, replace exclude

module code.byted.org/aweme/gomix

require (
        code.byted.org/aweme-go/bcache v0.0.0-20190816025257-cb327e85ee8a
        code.byted.org/data/databus_client v1.2.1 // indirect
        code.byted.org/golf/buffer_pool v0.0.0-20151120123746-3d60c9c70330 // indirect
)
  • Module 表明当前模块名称
  • Require 模块的依赖信息,包含直接、间接的依赖
  • Replace 指定依赖(后者)去代替前者
  • Exclude 用来忽略某些特定版本

go.mod & go.sum

Go.mod 记录了当前项目使用的第三方包,包名、版本号等关键信息

Go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,Go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。

启用 go mod

我们可以用环境变量GOMODULE来开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。

off: 项目需要在GOPATH下管理,go会从vendor -> gopath去管理包
auto: 项目如果在GOPATH下,则参照off的方式查找,否则直接根据go.mod方式管理
on: 不管项目是否在GOPATH内,都使用go module的方式管理包

go mod常用命令

go mod init 在当前目录初始化module
go mode tidy 移除项目中未使用的依赖,新增需要的依赖,不会改变模块的版本
go mod vendor 当依赖copy到 vendor目录下
go mod why 查看项目中为什么依赖某个包或者模块
go mod graph 查看模块的依赖图

如何使用go module

初始化

$ > go mod init

在任意目录下,新建你的项目,然后执行 go mod init ${repo} repo为模块的远程路径(repo=code.byted.org/aweme/gomix)执行完之后会生成 go.mod, go.sum二个模块管理的文件

添加&升级 依赖

>$ go get package

当你使用mod来管理包时,go get会自动下载安装package并且更新到版本信息到go mod文件中

go mod使用本地依赖包

很多时候我们在开发A repo时,依赖了 B repo,此时B也在开发中,由于go mod把依赖都下载到了$GOPATH/pkg/mod下,如果直接把B的代码切一个分支提交再go get下来,太蠢了 :(

使用replace指令将某个包指向另一个包或者是地址,愉快的开发调试吧

ps: replace指令中替换成的包需要有go.mod文件

module code.byted.org/aweme/gomix
require (
    code.byted.org/aweme-go/bcache v0.0.0-20190816025257-cb327e85ee8a
    code.byted.org/data/databus_client v1.2.1 // indirect
    code.byted.org/golf/buffer_pool v0.0.0-20151120123746-3d60c9c70330 // indirect
    code.byted.org/golf/logger v0.0.0-20160929064355-0a0db464847e // indirect
    code.byted.org/golf/metrics v0.0.0-20180319090601-41e3be1d73e4 // indirect
)
replace code.byted.org/gopkg/gorm => /User/name/go/src/xxx/

go mod管理之后,依赖包放在哪,还是GOPATH么?

依赖的第三方包会被下载到 $GOPATH/pkg/mod路径下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值