go - 使用 gomod 管理项目依赖
source link: https://www.tuicool.com/articles/6niaY3j
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
go 1.11.1
开始可以使用更优雅灵活的 module
机制做包依赖管理,能直接感受到的优点如下:
-
项目路径可以脱离
$GOPATH
了,不需要必须放在$GOPATH/src
下。 -
项目内部模块的引入是基于
moduleName
而不再死板的基于projectName
了。 -
半自动维护依赖,如果你很懒,你甚至可以不需要使用
get
预先安装依赖,module
在run test build
时会检测未下载的依赖,并自动下载它们。
回想以前吧! $GOPATH/src/projectName
后,项目中各模块互相引用的话都是基于 projectName
(go 的包加载机制导致的,去 $GOROOT/src
和 $GOPATH/src
去寻址,所以 projectName
也需要作为包引入路径的一部分),别人使用你的项目时也必须是 projectName
,否则就得把项目内的所有 projectName
改为他们的项目名,不优雅极了。
而 module
模式下,项目的包域是 moduleName
,和 projectName
无关,项目名称怎样都好, moduleName
会注册到加载路径中去。
虽然 module
可以灵活到消除 项目名
作为项目模块引入路径的槽点,但如果后面要转为普通的 vendor
模式的话,我们还是建议 moduleName
同 projetName
保持一致。
init
初始化项目为 module
模式: go mod init moduleName
# 不需要必须在 $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"
示例
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
模式下因为会自动的解析项目依赖,会自动的去下载那些未在本地的依赖包,删除那些不再需要的依赖包。
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
不常用,忽略
vendor
将 module
项目转为普通的 vendor
项目,这时就需要将项目移至 $GOPATH/src
下,并要保证 projectName
同 moduleName
保持一致,否则要手动去修改项目模块包的加载路径了。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK