go - 使用 gomod 管理项目依赖

go 1.11.1开始可使用更优雅灵活的module机制作包依赖管理,能直接感觉到的优势以下:git

  1. 项目路径能够脱离$GOPATH了,不须要必须放在$GOPATH/src下。
  2. 项目内部模块的引入是基于moduleName而再也不死板的基于projectName了。
  3. 半自动维护依赖,若是你很懒,你甚至能够不须要使用get预先安装依赖,modulerun test build时会检测未下载的依赖,并自动下载它们。

回想之前吧!$GOPATH/src/projectName后,项目中各模块互相引用的话都是基于projectName(go 的包加载机制致使的,去 $GOROOT/src$GOPATH/src 去寻址,因此projectName也须要做为包引入路径的一部分),别人使用你的项目时也必须是projectName,不然就得把项目内的全部projectName改成他们的项目名,不优雅极了。github

module模式下,项目的包域是moduleName,和projectName无关,项目名称怎样都好,moduleName会注册到加载路径中去。bash

虽然 module能够灵活到消除 项目名做为项目模块引入路径的槽点,但若是后面要转为普通的 vendor模式的话,咱们仍是建议 moduleNameprojetName保持一致。

init

初始化项目为module模式:go mod init moduleNameapp

# 不须要必须在 $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下,并要保证projectNamemoduleName保持一致,不然要手动去修改项目模块包的加载路径了。it

相关文章
相关标签/搜索