记录一下go工程迁移go modules的过程。

go mod

golang从1.11版本之后引入了包管理-go mod,并通过环境变量GO111MODULE 设置:

  • 默认GO111MODULE 为auto 在gopath路径下会从gopath 或者vendor中寻找依赖包,在外部会使用go module的方式寻找依赖包。
  • GO111MODULE =on 只会使用go module的方式寻找依赖包。
  • GO111MODULE =off 只会从gopath中寻找依赖包。

go mod 命令

go mod提供了以下的命令:

        download    download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed

go mod新建工程步骤

  • 在工程根目录下(如果GO111MODULE 为auto则工程不可以在gopath中)go mod init [module name]。在工程根目录下会产生一个go.mod文件。

    go mod 初始化的时候会自动导入vendor目录中的包。

    goland也支持使用go mod管理包,配置如图:



    go mod 会贯穿go tool工具链,go test, go vet, go build等工具都会先检查依赖。go mod会自动工作。
  • 执行 go build main.go会依次下载依赖包到gopath/pkg/mod中,并在go.mod中进行管理。

    执行go mod vendor会将所有的依赖包复制到工程vendor目录中。

    go.mod示例:
module server
go 1.12
require (      
github.com/360EntSecGroup-Skylar/excelize/v2 v2.0.2      
github.com/YoungPioneers/blog4go v0.5.9      
github.com/a8m/kinesis-producer v0.2.0      
github.com/antlr/antlr4 v0.0.0-20191115170859-54daca92f7b0 //
indirect      
github.com/apache/thrift v0.13.0     
github.com/astaxie/beego v1.12.0      
github.com/aws/aws-dax-go v1.0.1      
github.com/aws/aws-sdk-go v0.0.0-20180828194226-46ffe7480c9d      
github.com/fortytw2/leaktest v1.3.0 // indirect
)

go mod 会默认拉取最新的relase tag,如果没有,便拉取最新的commit记录。并支持版本控制。

indirect表明是间接引用。

注意:

"If an old package and a new package have the same import path, the new package must be backwards compatible with the old package."

“如果旧软件包和新软件包具有相同的导入路径,则新软件包必须与旧软件包向后兼容。”

  • If the module is version v2 or higher, the major version of the module must be included as a /vN at the end of the module paths used in go.mod files (e.g., module github.com/my/mod/v2, require github.com/my/mod/v2 v2.0.1) and in the package import path (e.g., import "github.com/my/mod/v2/mypkg"). This includes the paths used in go get commands (e.g., go get github.com/my/mod/v2@v2.0.1. Note there is both a /v2 and a @v2.0.1 in that example. One way to think about it is that the module name now includes the /v2, so include /v2 whenever you are using the module name).
  • If the module is version v0 or v1, do not include the major version in either the module path or the import path.
  • In general, packages with different import paths are different packages. For example, math/rand is a different package than crypto/rand. This is also true if different import paths are due to different major versions appearing in the import path. Thus example.com/my/mod/mypkg is a different package than example.com/my/mod/v2/mypkg, and both may be imported in a single build, which among other benefits helps with diamond dependency problems and also allows a v1 module to be implemented in terms of its v2 replacement or vice versa.

    来自于golang wiki

    如果导入了不兼容的高版本的包时,需要在import时表明版本。例import("github.com/360EntSecGroup-Skylar/excelize/v2")(restful 风格)。
  • 如果需要导入本地包,可以编辑go.mod文件,添加replace github.com/gohouse/goroom => /path/to/go/src/goroom

    ,并且需要在本地包根目录下执行go mod init [package name]

    否则go mod在本地包目录中找不到go.mod会报错。

    也可以是用go mod edit编辑。
  • 执行go mod tidy 增加丢失的module,去掉未用的module。
  • 配置好以后最后再执行go build main.go便会编译成功。

go modules包管理的更多相关文章

  1. [系列] 使用 go modules 包管理工具(一)

    目录 概述 初始化 添加依赖包 go mod 命令 小结 源码地址 概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上 ...

  2. 使用 go modules 包管理工具(一)

    概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上功能点,都是常用的,后期可能还会增加. 废话不多说,咱们开始吧. 创 ...

  3. golang包管理解决之道——go modules初探

    golang的包管理是一直是为人诟病之处,从golang1.5引入的vendor机制,到准官方工具dep,目前为止还没一个简便的解决方案. 不过现在go modules随着golang1.11的发布而 ...

  4. Golang modules包依赖管理工具

    初始化 执行go mod  init module-name,其中module-name为包名字,执行完后会生成go.mod文件,如下 module module-name go 1.13 包管理 使 ...

  5. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  6. node包管理器

    NPM小结   nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台.前端的可能性,从此更加具有想象空间. 随着一系列基于nodes的应用/ ...

  7. 程序包管理rpm、yum与简单编译安装程序

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  8. Linux程序包管理rpm与yum

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  9. 华为云提供针对Nuget包管理器的缓存加速服务

    在Visual Studio 2013.2015.2017中,使用的是Nuget包管理器对第三方组件进行管理升级的.而且 Nuget 是我们使用.NET Core的一项基础设施,.NET的软件包管理器 ...

随机推荐

  1. PHP TP框架自定义打印函数P

    效果如下,有个灰色背景,也不一定是灰色可以改 代码: //传递数据以易于阅读的样式格式化后输出function p($data){ // 定义样式 $str='<pre style=" ...

  2. centos7之firewalld防火墙的配置与使用

    firewalld是centos7开始提供的管理防火墙工具,提供了一个动态管理的防火墙,当然低层仍然调用的是 netfilter . 一.区域(zone)firewalld将网卡对应到不同的区域(zo ...

  3. laravel中的表单请求类型和CSRF防护(六)

    laravel中为我们提供了绑定不同http请求类型的函数. Route::get('/test', function () {}); Route::post('/test', function () ...

  4. ASP.NET Core基于K8S的微服务电商案例实践--学习笔记

    摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...

  5. PHP面试题2019年阿里巴巴面试题及答案解析

    一.单选题(共27题,每题5分) 1.Memcache与Redis的比较错误的是? A.Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据: B.Mem ...

  6. 这可能最简单的一种PS图片特效,零基础小白教程

    不少小伙伴都想学习PS,可是又觉得PS很难,学了一段时间却还是做不出什么惊艳的效果,没关系!小编今天就来教大家做一个超级简单的图片特效,就算是小白也能轻松学会!我们先来看看图片效果~ 想知道怎么做吗? ...

  7. node开发基础概念

    1.以严格模式运行一个js文件 node --use_strict xxx.js 2.退出node交互模式 连续按两次Ctrl+C. 3,node.js的模块不支持ES6的export.import规 ...

  8. SpringCloud Gateway拦截器遇到的小坑汇总

    很多朋友在使用SpringCloudGateway的时候可能都碰到过以下几个问题 SpringCloudGateway中如何读取Post请求体 private BodyInserter getBody ...

  9. 复习一下KVC

    一. 前言 KVC(Key Value Coding)是Cocoa框架为开发者提供的非常强大的工具,简单解释为:键值编码.它依赖于Runtime,在OC的动态性方面发挥了重要作用. 它主要的功能在于直 ...

  10. [20190524]sqlplus 与输出&.txt

    [20190524]sqlplus 与输出&.txt --//在sqlplus下 &一般作为参数替换,如何要输出&,一般有几种情况.据说这个问题是asktom站点查看最多的问题 ...