go 1.11.1
开始可使用更优雅灵活的module
机制作包依赖管理,能直接感觉到的优势以下:git
$GOPATH
了,不须要必须放在$GOPATH/src
下。moduleName
而再也不死板的基于projectName
了。get
预先安装依赖,module
在run test build
时会检测未下载的依赖,并自动下载它们。回想之前吧!$GOPATH/src/projectName
后,项目中各模块互相引用的话都是基于projectName
(go 的包加载机制致使的,去 $GOROOT/src
和 $GOPATH/src
去寻址,因此projectName
也须要做为包引入路径的一部分),别人使用你的项目时也必须是projectName
,不然就得把项目内的全部projectName
改成他们的项目名,不优雅极了。github
而module
模式下,项目的包域是moduleName
,和projectName
无关,项目名称怎样都好,moduleName
会注册到加载路径中去。bash
虽然module
能够灵活到消除项目名
做为项目模块引入路径的槽点,但若是后面要转为普通的vendor
模式的话,咱们仍是建议moduleName
同projetName
保持一致。
init
初始化项目为module
模式:go mod init moduleName
app
# 不须要必须在 $GOPATH/src 下 mkdir go_mod_proj && cd go_mod_proj go mod init app # go: creating new go.mod: module app # 会生成一个 go.mod 文件 查看内容以下 vi go.mod module app go 1.12 # module app 即定义了当前项目的包域 # 往常咱们要引入 go_mod_proj 下的 test 包须要 # import "go_mod_proj/test" # module 模式下则是 优雅的很 像 PHP 的命名空间映射同样灵活 # import "app/test"
示例ui
tree . . ├── go.mod ├── main.go └── utils └── msg.go
# go.mod module app go 1.12
# utils/msg.go package utils func Hello() { println("hello go") }
# main.go package main import ( "app/utils" // 注意项目模块包的引入是以 moduleName 做为包域的 ) func main() { utils.Hello() } # go run main.go
自动维护
咱们平常开发时须要某依赖包的话,都会使用 go get
下载后再运行,module
模式下由于会自动的解析项目依赖,会自动的去下载那些未在本地的依赖包,删除那些再也不须要的依赖包。code
tidy
tidy
主要用来手动维护项目的包依赖,会检测项目当前的依赖,作相应的记录或移除。开发
# 好比引入一个依赖包 package main import ( "app/utils" "github.com/sqrtcat/hello" ) func main() { utils.Hello() hello.Hello() }
# 运行一下 go mod tidy
# 查看 go.mod module app go 1.12 require github.com/sqrtcat/hello v0.0.0-20190617081741-06081a1a8fc1
# 删掉 main.go 中 hello 包的引入后再执行 # main.go package main import ( "app/utils" ) func main() { utils.Hello() }
# 运行一下 go mod tidy
# 查看 go.mod module app go 1.12
edit
不经常使用,忽略get
vendor
将module
项目转为普通的vendor
项目,这时就须要将项目移至$GOPATH/src
下,并要保证projectName
同moduleName
保持一致,不然要手动去修改项目模块包的加载路径了。it