公众号原文地址:https://mp.weixin.qq.com/s/SGGV3tWEg5AAJ7I_FcK0cg
目录
-
目录
-
说明
-
初始化
-
依赖包的默认导入
-
依赖包的特定版本导入
-
查看已添加依赖
-
依赖包的存放管理
-
依赖包的版本切换
-
删除未使用依赖包
-
引用项目中的 package
-
引用不同版本的父子目录
-
实例演示
-
需要注意的坑
-
IDE 与 Go Modules
-
IntelliJ IDEA/Goland
-
vim
-
参考
说明
Go 的依赖包管理一直是个问题,先后出现了 godep、glide、dep 等一系列工具,vendor 机制使依赖包的管理方便了很多,但依然没有统一的管理工具,不同的项目各用各的方法。
另外使用 vendor 后,每个项目都完整拷贝一份依赖包,既不方便管理又浪费了本地空间。
此外,Go 项目中的 import 指令后面的 package 路径与项目代码的存放路径相关,项目目录不能随意移动,必须安分守己地趴在 $GOPATH/src 中,否则 import 会找不到项目中
的 package,虽然可以通过在容器中编译或者为每个项目准备一套 Go 环境的方式解决,但是麻烦且有额外开销。
Go1.11 和 Go1.12 引入的 Go Modules 机制,提供了统一的依赖包管理工具 go mod,依赖包统一收集在 $GOPATH/pkg/mod 中进行集中管理,并且将 import 路径与项目代码的实际存放路径解耦,使 package 定义导入更加灵活。
Go Modules 将成为 Go1.13 默认的依赖包管理方法,在 Go1.11 和 Go1.12 中, Go Modules 只能在 $GOPATH 外部使用,Using Go Modules 中有详细介绍。
很多开源项目已经改用 Go Modules 了,浏览代码的时候会发现,很多项目的 master 分支中增加了 go.mod 和 go.sum 文件。
Go Modules 的主要功能就四个:添加依赖、更新依赖、删除依赖,以及多版本依赖。
初始化
Go Modules 的初始化命令为 go mod init <ROOTPATH>
,ROOTPATH 是项目的 import 路径。
在 $GOPATH 外部创建一个目录,然后初始化,项目的路径设置为 exampe.com/hello
:
$ mkdir go-modules-example$ cd go-modules-example$ go mod init example.com/hello # 该项目代码的引用路径是 example.com/hellogo: creating new go.mod: module example.com/hello
引用该项目中的 package 时使用前缀 example.com/hello
。
项目下生成一个 go.mod 文件,里面记录了 module 路径和 go 的版本,刚创建时这个文件中没有依赖信息:
$ cat go.modmodule example.com/hellogo 1.12
对于 Go1.11 和 Go1.12,如果在 $GOPATH 中执行 go mod 会遇到下面的错误:
$ go mod init example.com/hellogo: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
依赖包的默认导入
在 go-modules-example 中创建一个 main.go,简单写几行代码,引入 “github.com/lijiaocn/golib/version”:
// Create: 2019/05/05 16:53:00 Change: 2019/05/05 16:56:53// FileName: main.go// Copyright (C) 2019 lijiaocn <[email protected]> Distributed under terms of the GPL license.package mainimport ( "github.com/lijiaocn/golib/version")func main() { version.Show()}
用下面的 Makefile 编译&