go1.11.1 依赖包管理 go mod 总结

查看go版本:

itech8 :: ~ » go version

go version go1.11.1 darwin/amd64

module机制由环境变量GO111MODULE控制,它有三个值:off、on、auto,默认值是auto。

在auto模式下,在$GOPATH/src路径下build时,默认使用vendor、GOPATH导入第三方包,

而在GOPATH之外编译时,默认使用go.mod设置导入项目。我们知道vendor机制只有在GOPATH路径之下才起作用,到了GOPATH之外就没用了。

所以module机制可以看作是vendor机制的一个补充,在GOPATH之内,它可以和dep/govendor一样把依赖包导入vendor目录,

同时它又提升了go语言的灵活性,我们的源代码不再必须保存到GOPATH中,可以灵活组织目录结构。

GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。

GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。

GO111MODULE=auto 在$GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中

查看:

$GOPATH/pkg/mod

$GOPATH/pkg/mod/cache

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

go mod help

download download modules to local cache (下载依赖的module到本地cache))

edit edit go.mod from tools or scripts (编辑go.mod文件)

graph print module requirement graph (打印模块依赖图))

init initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))

tidy add missing and remove unused modules (增加丢失的module,去掉未用的module)

vendor make vendored copy of dependencies (将依赖复制到vendor下)

verify verify dependencies have expected content (校验依赖)

why explain why packages or modules are needed (解释为什么需要依赖)

显示所有Import库信息

go list -m -json all

-json JSON格式显示

all 显示全部库

1.首先完全开启 go modules

$GOPATH下的项目不开启

export GO111MODULE=on

2.在项目中初始化go.mod

mkdir /Users/itech8/data/app/go/src/echo

echo /Users/itech8/data/app/go/src/echo

#go mod init my-project-package-name

go mod init echo

这时会看到项目目录下面已有go.mod文件

内容是:

module echo

3.更新依赖关系

当我们使用go build,go test、go run以及go list时,go会自动得更新go.mod文件,将依赖关系写入其中

也可以手动处理依赖关系

go mod tidy (同时删除掉无用的)

这条命令会自动更新依赖关系,并且将包下载放入cache。

go mod tidy -v

-v 啰嗦模式

完成后,生成go.mod的require部分,和go.sum文件

可以在.gitignore中忽略掉go.sum,只需要保留go.mod。

依赖的 module 被文件下载到$GOPATH/pkg/cache/和$GOPATH/pkg/mod/文件夹下了

以echo框架官方demo为例,创建main.go文件

package main

import (

"github.com/labstack/echo"

"net/http"

)

func main() {

e := echo.New()

e.GET("/", func(c echo.Context) error {

return c.String(http.StatusOK, "Hello, World!")

})

e.Logger.Fatal(e.Start(":1323"))

}

1

2

3

4

5

6

7

8

9

10

11

12

13

packagemain

import(

"github.com/labstack/echo"

"net/http"

)

funcmain(){

e:=echo.New()

e.GET("/",func(cecho.Context)error{

returnc.String(http.StatusOK,"Hello, World!")

})

e.Logger.Fatal(e.Start(":1323"))

}

go run main.go

go: finding github.com/labstack/gommon/log latest

go: finding github.com/labstack/gommon/color latest

go: finding golang.org/x/crypto/acme/autocert latest

go: finding golang.org/x/crypto/acme latest

go: finding golang.org/x/crypto latest

.....

运行完毕,此时文件夹下多了一个go.sum文件,此时再看go.mod文件,已经改变为如下:

module echo

require (

github.com/labstack/echo v3.3.10+incompatible

github.com/labstack/gommon v0.2.8 // indirect

github.com/mattn/go-colorable v0.1.2 // indirect

github.com/valyala/fasttemplate v1.0.1 // indirect

golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 // indirect

)

1

2

3

4

5

6

7

require(

github.com/labstack/echov3.3.10+incompatible

github.com/labstack/gommonv0.2.8// indirect

github.com/mattn/go-colorablev0.1.2// indirect

github.com/valyala/fasttemplatev1.0.1// indirect

golang.org/x/cryptov0.0.0-20190530122614-20be4c3c3ed5// indirect

)

indirect 表示这个库是间接引用进来的。

前面部分是包的名字,也就是import时需要写的部分,而空格之后的是版本号,版本号遵循如下规律:

版本号+时间戳+hash,我们自己指定版本时只需要制定版本号即可,没有版本tag的则需要找到对应commit的时间和hash值。

go.sum是记录所依赖的项目的版本的锁定,

文件大致内容是:

github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=

github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=

github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=

.....

4.下面我们使用go build来编译我们的代码:

go build

值得注意的是,新增了一个编译选项“-mod”,它有如下的可选值:

go build -mod=readonly

在这个模式下任何会导致依赖关系变动的情况都将导致build失败,前面提到过build能查找并更新依赖关系,使用这个选项可以检查依赖关系的变动。

go build -mod=vendor

意思是忽略cache里的包,只使用vendor目录里的版本。构建成功。当发布时也只需要和使用godep时一样将vendor目录带上即可。

5. 修改修改依赖关系,修改包版本号

go mod edit -require="github.com/chromedp/chromedp@v0.1.0"

@后面加上你需要的版本号。go.mod已经修改了:

module test

require github.com/chromedp/chromedp v0.1.0

我们还需要让go modules更新依赖关系,这里我们手动go mod tidy

本地包替换

replace除了可以将远程的包进行替换外,还可以将本地存在的modules替换成任意指定的名字。

虽然不推荐直接编辑mod文件,但在这个例子中与使用go mod edit的效果几乎没有区别,所以你可以尝试自己动手修改my-mod/go.mod:

按需替换被墙的 module 地址:

replace (

cloud.google.com/go => github.com/GoogleCloudPlatform/google-cloud-go latest

golang.org/x/crypto => github.com/golang/crypto latest

golang.org/x/net => github.com/golang/net latest

golang.org/x/sync => github.com/golang/sync latest

golang.org/x/sys => github.com/golang/sys latest

golang.org/x/text => github.com/golang/text latest

google.golang.org/appengine => github.com/golang/appengine latest

)

1

2

3

4

5

6

7

8

9

replace(

cloud.google.com/go=>github.com/GoogleCloudPlatform/google-cloud-golatest

golang.org/x/crypto=>github.com/golang/cryptolatest

golang.org/x/net=>github.com/golang/netlatest

golang.org/x/sync=>github.com/golang/synclatest

golang.org/x/sys=>github.com/golang/syslatest

golang.org/x/text=>github.com/golang/textlatest

google.golang.org/appengine=>github.com/golang/appenginelatest

)

6.切换回 Vendor 模式

目前 go mod 各方面支持还不够完善,如果想切换回 vendor 模式,可以通过下面两种方式

临时切换

$ go mod vendor

$ go run -mod=vendor main.go

# 或设置成全局环境变量

# export GOFLAGS=-mod=vendor

$ go run main.go

当然这个命令并不能让你从godep之类的工具迁移到go modules,它只是单纯地把go.sum中的所有依赖下载到vendor目录里,

如果你用它迁移godep你会发现vendor目录里的包会和godep指定的产生相当大的差异,所以请务必不要这样做。

require github.com/labstack/echo latest

# 版本号必须填写或者latest 获取最新版本

参考资料:

1.module机制和dep/govendor机制是否冲突?

https://studygolang.com/articles/14440?fr=sidebar

https://www.cnblogs.com/apocelipes/p/10295096.html

python123.io同一个号可以同时在不同设备登陆吗-ITech8 - 合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下!...相关推荐

  1. python123.io同一个号可以同时在不同设备登陆吗-Python 高级 3

    1.编辑器vim 目标 能够说出vim三种工作模式 能够写出vim复制.剪切.粘贴.选中多行命令 yy,dd,p,数字+V 能够写出查找.替换命令 :/要查找的内容,n下一个,N上一个 :%s/要替换 ...

  2. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

    目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...

  3. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备

    一.引言 很久前接触linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理: 二.Linux内核主次设备号的管理 Li ...

  4. QQ号转换成16进制登陆

    QQ号转换成16进制登陆 闲来无事,把自己的QQ号码进行进制转换,以十进制转换成十六进制进行登陆 很好玩,可以拿来装逼 在线进行转换链接 登陆的时候需要在十六进制之前加上 0x,然后进行登陆,完全没毛 ...

  5. 国际会计准则第16号--不动产、厂房和设备

    国际会计准则第16号--不动产.厂房和设备 2006-09-02   来源:中国会计网   作者:   参与讨论:会计论坛 (1993年12月修订) 目的 本号准则的目的是规定不动产.厂房和设备的会计 ...

  6. Linux驱动开发之主设备号找驱动,次设备号找设备

    原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8805179,作者:gqb666 一.引言   最近成都地 ...

  7. 内核怎么通过主设备号找驱动、次设备号找设备

    之前看韦东山老师视频,说到linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理.在内核中,dev_t  类型( 在 ...

  8. ARM2440触摸屏编程(裸机编程)

    俗话说:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下.只有基础扎实了,做事情才能更得心应手.对于编程也是一样的,只有对各个器件的工作原理摸得一清二楚,才能高效地写出好代码.所以学习驱动和 ...

  9. python123 io平台-Java Review(三十六、IO)

    Java 的 IO 通过 java.io 包下的类和接口来支持, 在 java.io 包下主要包括输入. 输出两种 10 流, 每种输入. 输出流又可分为字节流和字符流两大类. 其中字节流以字节为单位 ...

最新文章

  1. 简单完整地讲解tensorflow模型的保存和恢复
  2. Java命令行运行参数说明大全--转
  3. 自定义镜像-镜像结构
  4. 所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市
  5. 单片机、ARM、DSP与CPU之间的关系大揭秘
  6. linux内核源码代码量,Linux内核源代码数量已经超过1000万行
  7. php完美导出word,PHP使用phpword生成word文档
  8. 学习OpenVINO笔记之Inference Engine
  9. 学习PowerShell和SQL Server –简介
  10. linux ubi代码分析,linux ubi文件系统
  11. php 时间转换时间戳_php时间戳与date格式转换
  12. 代码的坏味道之十七 :Inappropriate Intimacy(狎昵关系)
  13. CSAPP实验2:bomblab
  14. 凸包算法-------Graham扫描法
  15. 可兼容所有浏览器的“收藏本站”、“设为首页”js代码
  16. 低端Windows平板汇总
  17. 华为是如何从0到1打造以项目为中心运作的项目管理体系的?
  18. Hadoop 深入浅出----HDFS(2)
  19. 普渡大学统计与计算机科学,普渡大学本校 Purdue University-Main Campus
  20. class常量池、运行时常量池 和 字符串常量池 的区别

热门文章

  1. 国外7个免费的网络主机服务
  2. C语言函数指针使用的一个例子(Win10,VS2022)
  3. v-loading的使用(ElementUI)
  4. 20190513面试B树
  5. Java 多线程学习笔记(狂神)
  6. Java输出水仙花数
  7. Android 下使用 FFmpeg 命令行工具与问题排查
  8. 如何学习一门计算机语言
  9. Seq2Seq Attention模型
  10. PWM互补脉冲配置,互补输出异常