go mod包管理

介绍

  • 从 Go1.11 开始,golang 官方支持了新的依赖管理工具go mod

  • go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目

go mod 命令

download    下载依赖的module到本地cache
edit        编辑go.mod文件
graph       打印模块依赖图
init        在当前文件夹下初始化一个新的module, 创建go.mod文件
tidy        增加丢失的module,去掉未用的module
vendor      将依赖复制到vendor下,注意依赖需要在import 中声明后才能进行导入
verify      校验依赖
why         解释为什么需要依赖
go clean -modcache 清除缓存

使用

  • go mod init [模块名] : 创建go.mod文件

  • go.mod 提供了module, requirereplaceexclude 四个命令

    • module 语句指定包的名字(路径)
    • require 语句指定的依赖项模块
    • replace 语句可以替换依赖项模块
    • exclude 语句可以忽略依赖项模块
  • go module 安装 package 的原則是先拉最新的 release tag,若无tag则拉最新的commit。

  • Go1.13为环境变量GOPROXY设置了默认路径:https://proxy.golang.org,direct。但是由于某些因素,这个使用不了,你懂的。所以七牛云为中国的gopher提供了一个免费合法的代理goproxy.cn,其已经开源。只需一条简单命令就可以使用该代理:
    
    go env -w GOPROXY=https://goproxy.cn,direct
    

在旧项目中使用

  • go mod init: 在项目根目录下执行该命令,会在项目根目录下生成一个go.mod文件。
  • go mod tidy: 在项目根目录下执行该命令,go mod 会自动分析你当前项目所需要的依赖,并且将他们下载下来。

在新项目中使用

# go mod init 目录名  ,go mod初始化
root@default:/share/platform# go mod init platform
go: creating new go.mod: module platform

root@default:/share/platform# cat go.mod
module platform

go 1.13




# 新建test.go
package main
 
import (
        api "github.com/tuweiguang/GoTestLib/api"
)
 
func main() {
    api.MyApi()
}

root@default:/share/platform# go build test.go
go: finding github.com/tuweiguang/GoTestLib v0.0.6
go: downloading github.com/tuweiguang/GoTestLib v0.0.6
go: extracting github.com/tuweiguang/GoTestLib v0.0.6
root@default:/share/platform# cat
dister/  go.mod   go.sum   test     test.go
root@default:/share/platform# cat
dister/  go.mod   go.sum   test     test.go
root@default:/share/platform# cat go.mod
module platform

go 1.13

require github.com/tuweiguang/GoTestLib v0.0.6 // indirect

更新依赖包

  • 检查依赖包有没有更新版本。

    [root@localhost hello]# go list -m -u all
    hello
    github.com/tuweiguang/GoTestLib v0.0.5
    

    表示当前依赖的包GoTestLib是最新版,如果有最新版会出现(但是有时会检测不到):

    go: finding github.com/tuweiguang/GoTestLib latest
    GoTestApi
    github.com/tuweiguang/GoTestLib v0.0.5
    
  • 更新依赖包。这里只介绍2种更新:

    1.更新到指定版本。
    2.更新到当前最新修订版版本。
    
    [root@localhost hello]# go run test.go //更新前
    this is MyApi
    this is MyApi2
    this is MyApi3
    this is MyApi4
    this is MyApi5
    this is MyApi6
    [root@localhost hello]# go get github.com/tuweiguang/GoTestLib@v0.0.6 //指定版本,注意最开始测试最新版本是v0.0.5,v0.0.6是刚才才加的
    go: finding github.com/tuweiguang/GoTestLib v0.0.6
    go: downloading github.com/tuweiguang/GoTestLib v0.0.6
    go: extracting github.com/tuweiguang/GoTestLib v0.0.6
    build _/root/go/pkg/mod/github.com/tuweiguang/_go_test_lib@v0.0.6/api: cannot find module for path _/root/go/pkg/mod/github.com/tuweiguang/_go_test_lib@v0.0.6/api
    [root@localhost hello]# go run test.go //更新后
    this is MyApi
    this is MyApi2
    this is MyApi3
    this is MyApi4
    this is MyApi5
    this is MyApi6
    this is MyApi7
    
    [root@localhost tuweiguang]# pwd
    /root/go/pkg/mod/github.com/tuweiguang
    [root@localhost tuweiguang]# ls
    !go!test!lib@v0.0.5  !go!test!lib@v0.0.6
    
    再看看go.mod和go.sum文件:
    [root@localhost hello]# cat go.sum 
    github.com/tuweiguang/GoTestLib v0.0.5 h1:EC5pWmPdQbXPB7qUkI18rvwKRSk8Yp8MGxD6qDwNUIs=
    github.com/tuweiguang/GoTestLib v0.0.5/go.mod h1:Oeto69u+Bjg5iL6sEf1GguoQ85Yrv/YHiVZGXOZq7HU=
    github.com/tuweiguang/GoTestLib v0.0.6 h1:l/uLGgnp+90T6SVCZ6qhvajjbAEmlF01sPeOjv37evI=
    github.com/tuweiguang/GoTestLib v0.0.6/go.mod h1:Oeto69u+Bjg5iL6sEf1GguoQ85Yrv/YHiVZGXOZq7HU=
    [root@localhost hello]# cat go.mod 
    module hello
    
    go 1.13
    
    require github.com/tuweiguang/GoTestLib v0.0.6
    

replace

不过因为某些未知原因,并不是所有的包都能直接用go get获取到,这时我们就需要使用go modules的replace功能了。

go mod edit -replace=old[@v]=new[@v]
old是要被替换的package,new就是用于替换的package。
一些常用包replace
replace(
    golang.org/x/text => github.com/golang/text latest
    golang.org/x/net => github.com/golang/net latest
    golang.org/x/crypto => github.com/golang/crypto latest
    golang.org/x/tools => github.com/golang/tools latest
    golang.org/x/sync => github.com/golang/sync latest
    golang.org/x/sys => github.com/golang/sys latest
    cloud.google.com/go => github.com/googleapis/google-cloud-go latest
    google.golang.org/genproto => github.com/google/go-genproto latest
    golang.org/x/exp => github.com/golang/exp latest
    golang.org/x/time => github.com/golang/time latest
    golang.org/x/oauth2 => github.com/golang/oauth2 latest
    golang.org/x/lint => github.com/golang/lint latest
    google.golang.org/grpc => github.com/grpc/grpc-go latest
    google.golang.org/api => github.com/googleapis/google-api-go-client latest
    google.golang.org/appengine => github.com/golang/appengine latest
    golang.org/x/mobile => github.com/golang/mobile latest
    golang.org/x/image => github.com/golang/image latest
 )

go mod 取代GOPATH

20

21

"wserver/route" 导入这个包的地方是 模块内的绝对路径,就是要从go.mod所在的目录开始。运行的时候就会自动包含子目录,不需要单独去编译。

例如我们可以直接:go run main.go

常见问题

问题1

问题:

build command-line-arguments: cannot load github.com/tuweiguang/GoTestLib/api: module github.com/tuweiguang/GoTestLib/api: Get https://proxy.golang.org/github.com/tuweiguang/%21go%21test%21lib/api/@v/list: dial tcp 172.217.24.17:443: i/o timeout

解决:

go env -w GOPROXY=https://goproxy.cn,direct

问题2

build command-line-arguments: cannot load google.goland.org/grpc: cannot find module providing package google.goland.org/grpc

原因:可能是国内访问不了谷歌导致的,我们选用国内的源,其实是乌龙,只是golang写成了goland

查看go.mod

go 1.13

require (
        github.com/astaxie/beego v1.12.1
        github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd
        github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542
        github.com/golang/protobuf v1.3.5
        github.com/satori/go.uuid v1.2.0
        google.golang.org/grpc v1.28.0
)

查看下载目录

root@ubuntu:/home/xzw/platform# ls   /root/go/pkg/mod/google.golang.org/ 
genproto@v0.0.0-20190819201941-24fa4b261c55  grpc@v1.28.0

解决方法就是再github上找到源码去替换他

地址:https://github.com/golang/protobuf/

go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest

最后发现replace都不用,go env -w GOPROXY=https://goproxy.cn,direct,设置完这个是可以下载谷歌包的。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×