Go Module 简明教程
用惯了dep,突然换到 go mod,真是不习惯。
首先我们执行一下看看有什么效果:
$ go mod
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
Usage:
go mod <command> [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
Use "go help mod <command>" for more information about a command.
翻译一下:
go mod download下载模块到本地缓存,缓存路径是$GOPATH/pkg/mod/cachego mod edit是提供了命令版编辑go.mod的功能,例如go mod edit -fmt go.mod会格式化go.modgo mod graph把模块之间的依赖图显示出来go mod init初始化模块(例如把原本dep管理的依赖关系转换过来)go mod tidy增加缺失的包,移除没用的包go mod vendor把依赖拷贝到vendor/目录下go mod verify确认依赖关系go mod why解释为什么需要包和模块
注意有几个坑的地方:
go mod命令在$GOPATH里默认是执行不了的,因为GO111MODULE的默认值是auto。默认在$GOPATH里是不会执行, 如果一定要强制执行,就设置环境变量为on。go mod init在没有接module名字的时候是执行不了的,会报错go: cannot determine module path for source directory。可以这样执行:$ go mod init github.com/jiajunhuang/hello
否则就要在 main.go 里加上导入声明,例如:
$ cat main.go
package main
func main() {
println("Hello world")
}
$ go mod init
go: cannot determine module path for source directory /Users/jiajun/hello (outside GOPATH, no import comments)
$ vim go.mod
$ cat go.mod
module github.com/jiajunhuang/hello
$ go mod init
go mod init: go.mod already exists
$ rm go.mod
$ vim main.go
$ cat main.go
package main // import "github.com/jiajunhuang/hello"
func main() {
println("Hello world")
}
$ go mod init
go: creating new go.mod: module github.com/jiajunhuang/hello
$ ls
go.mod main.go
$ cat go.mod
module github.com/jiajunhuang/hello
当然,如果在已有代码的仓库里执行是不存在这个问题的。
go mod 和 dep 比较
go mod支持代理,以后就可以使用私有镜像源了~,具体请搜索GOPROXYgo mod速度比dep快很多go.mod中列出了所有的依赖,这一点其实我不是很喜欢,因为当项目一大,历史一久,只要升级其中一个依赖,很可能整个依赖 就挂了。我还是比较喜欢只要列出顶级依赖,由程序处理子依赖的情况。
一个生成的 go.mod 的示例
module github.com/my/module/v3 // 这是你的包的声明
// require 里是依赖。需要带上路径和版本。
require (
github.com/some/dependency v1.2.3
github.com/another/dependency v0.1.0
github.com/additional/dependency/v4 v4.0.0
)
邮件 订阅
RSS 订阅
Web开发简介系列
数据结构的实际使用
Golang 简明教程
Python 教程