Golang Module快速入门

Golang Module快速入门

前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制。

注意:

  • 在Golang1.11版本中需要使用GO111MODULE=on来显式开启go module

  • 在Golang1.12之后默认开启了module

基本命令

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init projectname        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

注意启用go mod时

  • Windows环境用set
  • linux环境用export

查看go配置

go env 查看所有配置
go env GO111MODULE 查看GO111MODULE
go env GOMODCACHE 查看GOMODCACHE
go env GOPROXY 查看代码地址

启用 go mod (linux环境)

  1. 启用当前项目的go mod 模式 设置代理
    只对当前项目有效

    export GO111MODULE=on  #on(开启) / off(关闭)
    export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct  ## 设置代理
    export GOMODCACHE=/media/haima/34E401CC64DD0E281/site/go/pkg/mod  ## 设置go mod 下载依赖的到本地什么位置
    go mod init projectname # projectname(创建的项目名字)
    go mod tidy #下载依赖
    
  2. 全局启用gomod

Go1.14版本之后,都推荐使用go mod模式来管理依赖了,也不再强制我们把代码必须写在GOPATH下面的src目录了,你可以在你电脑的任意位置编写go代码。
Go1.16
默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct
由于国内访问不到 https://proxy.golang.org 所以我们需要换一个PROXY,这里推荐使用https://goproxy.iohttps://goproxy.cn

可以执行下面的命令修改GOPROXY

设置全局
go env -w GO111MODULE=on #设置全局开启 go mod Go1.16版本默认为on,可跳过这一步
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct #设置全局代理地址
go env -w GOMODCACHE=/media/haima/34E401CC64DD0E281/site/go/pkg/mod ## 设置go mod 下载依赖的到本地什么位置

以下三个代理地址都可以

https://goproxy.cn  //七牛云赞助支持的开源代理
https://mirrors.aliyun.com/goproxy  //阿里云官方维护的go代理
https://goproxy.io //也是一个开源的go代理

安装依赖包

go mod tidy

如果有下载不了的包,可以用replace转换


module github.com/Q1mi/studygo/blogger

go 1.12

require (
	github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	github.com/jmoiron/sqlx v1.2.0
	github.com/satori/go.uuid v1.2.0
	google.golang.org/appengine v1.6.1 // indirect
)

其中,

  • module 用来定义项目名
  • require 用来定义依赖包及版本
  • indirect 表示间接引用

依赖的版本

go mod支持语义化版本号,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,当然也可以跟git提交哈希,比如go get foo@e3702bed2。关于依赖的版本支持以下几种格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

replace

在国内访问golang.org/x的各个包都需要FQ,你可以在go.mod中使用replace替换成github上对应的库。

replace (
    cloud.google.com/go => github.com/cloudlibz/gocloud v0.0.0-20190327150524-ce252de9e210
    golang.org/x/build => github.com/golang/build v0.0.0-20190416225751-b5f252a0a7dd
    golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190411191339-88737f569e3a
    golang.org/x/exp => github.com/golang/exp v0.0.0-20190413192849-7f338f571082
    golang.org/x/image => github.com/golang/image v0.0.0-20190417020941-4e30a6eb7d9a
    golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422
    golang.org/x/mobile => github.com/golang/mobile v0.0.0-20190415191353-3e0bab5405d6
    golang.org/x/mod => github.com/golang/mod v0.1.0
    golang.org/x/net => github.com/golang/net v0.0.0-20190415214537-1da14a5a36f2
    golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20190402181905-9f3314589c9a
    golang.org/x/perf => github.com/golang/perf v0.0.0-20190312170614-0655857e383f
    golang.org/x/sync => github.com/golang/sync v0.0.0-20190412183630-56d357773e84
    golang.org/x/sys => github.com/golang/sys v0.0.0-20190416152802-12500544f89f
    golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4
    golang.org/x/tools => github.com/golang/tools v0.0.0-20190417005754-4ca4b55e2050
    golang.org/x/xerrors => github.com/golang/xerrors v0.0.0-20190410155217-1f06c39b4373
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
    google.golang.org/api => github.com/googleapis/google-api-go-client v0.3.2
    google.golang.org/appengine => github.com/golang/appengine v1.5.0
    google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190415143225-d1146b9035b9
    google.golang.org/grpc => github.com/grpc/grpc-go v1.20.0
    gopkg.in/asn1-ber.v1 => github.com/go-asn1-ber/asn1-ber v0.0.0-20181015200546-f715ec2f112d
    gopkg.in/fsnotify.v1 => github.com/Jwsonic/recinotify v0.0.0-20151201212458-7389700f1b43
    gopkg.in/gorethink/gorethink.v4 => github.com/rethinkdb/rethinkdb-go v4.0.0+incompatible
    gopkg.in/ini.v1 => github.com/go-ini/ini v1.42.0
    gopkg.in/src-d/go-billy.v4 => github.com/src-d/go-billy v4.2.0+incompatible
    gopkg.in/src-d/go-git-fixtures.v3 => github.com/src-d/go-git-fixtures v3.4.0+incompatible
    gopkg.in/yaml.v2 => github.com/go-yaml/yaml v2.1.0+incompatible
    k8s.io/api => github.com/kubernetes/api v0.0.0-20190416052506-9eb4726e83e4
    k8s.io/apimachinery => github.com/kubernetes/apimachinery v0.0.0-20190416092415-3370b4aef5d6
    k8s.io/client-go => github.com/kubernetes/client-go v11.0.0+incompatible
    k8s.io/klog => github.com/simonpasquier/klog-gokit v0.1.0
    k8s.io/kube-openapi => github.com/kubernetes/kube-openapi v0.0.0-20190401085232-94e1e7b7574c
    k8s.io/utils => github.com/kubernetes/utils v0.0.0-20190308190857-21c4ce38f2a7
    sigs.k8s.io/yaml => github.com/kubernetes-sigs/yaml v1.1.0
    github.com/Unknwon/com => github.com/unknwon/com latest  //不知道版本,可以用这个latest下载最新的
    github.com/Unknwon/com => github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e
)

手动下载安装依赖包

go get -u 包地址

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version

如果下载所有依赖可以使用go mod download命令。
整理依赖

我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系。

go mod edit

格式化

因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:

go mod edit -fmt

添加依赖项

go mod edit -require=golang.org/x/text

移除依赖项

如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:

go mod edit -droprequire=golang.org/x/text

关于go mod edit的更多用法可以通过go help mod edit查看。

在项目中使用go module
既有项目

如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:

  • 在项目目录下执行go mod init,生成一个go.mod文件。
  • 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。

新项目

对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:

  • 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
  • 执行go mod tidy 下载安装依赖包
  • 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

更多详细说明文档:
https://www.liwenzhou.com/posts/Go/go_dependency/

posted @ 2019-12-16 06:57  HaimaBlog  阅读(708)  评论(0编辑  收藏  举报