Go Module是Go会在1.12中正式推出的包管理机制。

Go mod 简介

Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具。从我个人的角度上来看存在两个问题:

  1. GOPATH特性对于多工程的情况下,支持不算友好。
  2. GOPATH无法对依赖包进行有效的版本管理,没有任何地方能够表明依赖包的具体版本号,无法简单清晰获取到有效的依赖包版本信息等。

在Go1.11时,官方推出了go mod作为官方的依赖管理工具。而go mod与之前的利用vendor特性的依赖管理工具的不同点在于,go mod 更类似于maven这种本地缓存库的管理方式,不论你有多少个工程,只要你引用的依赖的版本是一致的,那么在本地就只会有一份依赖文件的存在。而vendor即使依赖的版本是相同的,但如果在不同的工程中进行了引用,也会在工程目录下的vendor产生一份依赖文件。

所以Golang在1.11版本中引入了go mod机制,在统一的位置对依赖进行管理。

go mod不同于以往基于GOPATH和Vendor的构建方式,其主要是通过GOPATH/pkg/mod下的缓存包来对工程进行构建。在Go 1.11中已经可以使用,同以往新添加的功能一样,go mod 可以通过GO111MODULE来控制是否启用,GO111MODULE有一下三种类型。

  • on 所有的构建,都使用Module机制
  • off 所有的构建,都不使用Module机制,而是使用GOPATH和Vendor
  • auto 在GOPATH下的工程,不使用Module机制,不在GOPATH下的工程使用

Go mod化处理步骤

这里我主要说一下,对旧工程如何进行go mod化处理。通过网上搜索的文档加上自我实践,我总结成了以下三个步骤。对于新工程的处理可直接从第二部分开始。

  • 将需要进行版本管理的代码从GOPATH路径下移出
  • 在项目的根目录下使用命令go mod init projectName
  • 在该目录下执行go build main.go

从GOPATH中移出工程

这一步其实是不一定需要的,不过个人认为可以将工程从GOPATH下移出,单独存放。只在GOPATH/pkg/mod目录下只存放依赖文件。

在go1.12环境下,我试验了一下环境变量GO111MODULE还是起作用的。但是编译时默认为使用Module机制进行编译(即GO111MODULE=on)。

  1. 如果工程中存在go.mod文件,编译时是从GOPATH/pkg/mod下查找依赖。
  2. 如果主动使用export GO111MODULE=off命令不使用Module机制,进行编译就会从GOPATH/src下查找依赖。会产生以下输出。(编译失败是由于相应目录下无依赖文件)

/usr/local/Cellar/go/1.12.5/libexec/src/golang.org/x/tools/internal/tool (from $GOROOT)

/Users/dx/go/src/golang.org/x/tools/internal/tool (from $GOPATH)

初始化go mod

在这一步根据我的实践,需要说一下。一般网上的资料都是建议在工程的根目录下执行go mod init projectName命令。在执行go mod化之后,所有的引用都不再是以GOPATH为相对路径的引用了,而是变成了以go.mod中初始化的项目名为起始的引用。

示例:

未使用go mod前,当前工程路径和GOPATH为workspace/testmod,即当前工程的结构如下:

├── bin

├── pkg

└── src

├── api

│ └── supply

│ └── location

│ └── location.go

└── main.go

location.go

package location

import (

"fmt"

)

func Hi(name string) string {

return fmt.Sprintf("hello %s

go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod相关推荐

  1. go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制

    简介 Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司. 在互联网发展至今,软件系统不断膨胀. 各个编程语言也都逐步支持了 ...

  2. maven 公共模块依赖_「spring-boot 源码解析」spring-boot 依赖管理

    问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包.三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整. 微信公众号: ...

  3. cgi进程设置多少 宝塔_开源、强大的Linux服务器集群管理工具,比宝塔好用!

    「 点击图片获取最近两年爆款好文 」 在这之前肯定很多人都接触过Linux管理面板:宝塔,宝塔的确非常方便而且好用,安装也简单,复制粘贴几句命令即可安装完成,且提供免费版.今天呢,民工哥向大家介绍另一 ...

  4. 如何初始化结构体中的指针结构体_跟我一起学习go语言(五)golang中结构体的初始化方法...

    1.自定义一个结构体 type Vertex struct { X, Y float64} 2.初始化方法-指针: rect1 := new(Vertex )rect2 := &Vertex ...

  5. declare sql语句_每天10分钟学习T-SQL语言基础(Part 5)

    [数据库技术]| 作者 / Edison Zhou <Microsoft SQL Server 2008技术内幕:T-SQL语言基础>是一本关于T-SQL方面的好书,可能现在我们在京东上都 ...

  6. 如何快速学好python语言_如何快速的学习Python语言

    本文主要向大家介绍了如何快速的学习Python语言,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基于自己的学习方法来分享,请客观的看待我提到的几点意见,谢谢. 文末有我自己在g ...

  7. supervisor 重启_每日一说:说一下supervisor进程管理工具

    需求:在Linux服务器上有一个python 服务,需要保证它一直提供服务,一旦意外停止立刻自动启动.实现方法可能有很多. 由于项目中需要,别人推荐supervisor,那么今天就聊一下supervi ...

  8. AndroidStudio_Gradle命令行的使用_使用gradle命令编译出apk_以及依赖管理---Android原生开发工作笔记77

    对于gradle的安装来说. 然后我们去看一下gradle,很简单这个工具,下载以后,解压 然后找到bin目录 去配置环境变量 然后androidstudio,也有自带的gradle,也可以把这个bi ...

  9. Go:包管理工具GOPATH、vendor、dep 、go module

    目录 Go包管理工具:前言 GOPATH vendor.dep Go modules Module 文件 go mod命令 Go modules使用步骤: go module的文件下载后位置: Go包 ...

最新文章

  1. raymarching算法
  2. OD使用教程6 - 调试篇06|解密系列
  3. 现在流行的源程序版本管理软件和项目管理软件
  4. 精算模型10 非参数模型0 精算数据、非参数建模的思路概述
  5. Eclipse AST 实现一个类信息统计小程序
  6. 带你少走弯路:强烈推荐的TensorFlow快速入门资料和翻译(可下载)
  7. linux删除grid数据文件,MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除...
  8. lock.lock_HibernateCascadeType.LOCK陷阱
  9. IO之StringIO和BytesIO
  10. 虚拟机virtualBox
  11. ERROR: The environment variable VG_GNU_PACKAGE must be set. Aborting.
  12. 078、Docker 最常用的监控方案(2019-04-25 周四)
  13. 区块链应用 | 区块链的火爆会一直持续吗?
  14. Pandas DataFrame merge join concat append combin_first 使用demo
  15. AUTOCAD——光顺曲线命令、分解命令
  16. 论文写作过程中用到的软件、网站分享
  17. thinkphp 下实现繁简体汉字转换
  18. 支付宝直付通怎么签约教程详解,支付宝直付通开通需要什么条件!
  19. “唵嘛呢叭咪吽”是什么意思? - 搜搜问问
  20. if语句的基本使用语法

热门文章

  1. pageSet还没完count就执行了
  2. SAP UI5 enhancement on resourceBundle
  3. 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
  4. R3 data related to category and hierarchy mapping logic in CRM
  5. 使用postman消费Marketing Cloud的contact读取API
  6. SAP WebIDE 里 UI5 应用的隐藏文件 project.json
  7. time zone issue in text processing
  8. SAP S/4HANA 物料搜索(Material Search) 页面的外观和背后调用的 OData 服务
  9. ABAP Business switc和business function简介
  10. Mockito框架实现学习之when(dummy)