26

go - 使用 gomod 管理项目依赖

 4 years ago
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 机制做包依赖管理,能直接感受到的优点如下:

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

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

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

虽然 module 可以灵活到消除 项目名 作为项目模块引入路径的槽点,但如果后面要转为普通的 vendor 模式的话,我们还是建议 moduleNameprojetName 保持一致。

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 下,并要保证 projectNamemoduleName 保持一致,否则要手动去修改项目模块包的加载路径了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK