软件开发中,不可避免的会使用到第三方库,因此包管理工具可以极大的方便开发者管理第三方依赖,避免掉入“依赖地狱”。

作为google强大背书的golang语言,golang官方包管理工具终于“千呼万唤始出来”。 下面我们就来介绍一下golang的包管理工具

golang包管理工具

安装

go module是go语言内置的包管理工具,安装好go就可以使用

要求: go version >= 1.11

命令详细说明如下:

$ go mod
Go mod provides access to operations on modules. Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality. Usage: go mod <command> [arguments] The commands are: 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 Use "go help mod <command>" for more information about a command.

设置环境变量:GO111MODULE

  • 可在 /etc/profile 或 ~/.bash_profile 下添加 'GO111MODULE=on', 永久生效(新打开终端)
  • 或在单个工程根目录下,在终端下输入 'export GO111MODULE=on',临时生效(本终端)

注:modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,并且是文件权限是只读的 -r--r--r--,且多个项目可以共享缓存的 module

操作手册

初始化,并下载依赖

进入到当前工程的目录下

$ go mod init github.com/USERNAME/myRepo #生成go.mod文件(项目中只需要执行一次)
$ go mod tidy #下载依赖包
$ go mod verify #验证(optional)

vendor模式

执行go mod vendor,会在项目下生成新的vendor目录,并把项目依赖下载到vendor中,(在go mod诞生之前,相信大家都比较熟悉govendor,这里不在赘述)

此时vendor里的依赖只有项目中被使用的文件(例如:未被引用的子目录 、*_test.go等不会被包含)

golang第三方包源

墙外有很多优秀的资源, 比如golang.org上的第三方包,可以通过以下两种方式来下载

代理goproxy

设置golang环境变量GOPROXY

export GOPROXY=http://goproxy.io (官方维护,香港节点,该地址可稳定访问)
export GOPROXY=http://mirrors.aliyun.com/goproxy/ (该地址速度快,但有些包版本无法获取)
export GOPROXY=https://athens.azurefd.net (微软cdn节点,也很稳定,快速) 推荐
export GOPROXY=https://gocenter.io

注:上述golang源选择其一即可。如果你使用的 Go version>=1.13, 可以通过设置 GOPRIVATE 环境变量来控制哪些私有仓库和依赖(公司内部仓库)不通过proxy来拉取,直接走本地,设置如下:

go env -w GOPROXY=https://goproxy.io,direct
go env -w GOPRIVATE=*.corp.example.com # 设置不走 proxy 的私有仓库,多个用逗号相隔
地址替换replace

go mod提供了replace来解决国内开发者无法访问墙外资源的痛苦。具体方法如下:

编辑go.mod文件,在文件末尾添加下面这些被墙的包,执行go mod tidy下载。下面整理了一下经常需要的包~

replace golang.org/x/net => github.com/golang/net latest
replace golang.org/x/tools => github.com/golang/tools latest
replace golang.org/x/crypto => github.com/golang/crypto latest
replace golang.org/x/sys => github.com/golang/sys latest
replace golang.org/x/text => github.com/golang/text latest
replace golang.org/x/sync => github.com/golang/sync latest
replace golang.org/x/exp => github.com/golang/exp latest
replace golang.org/x/lint => github.com/golang/lint latest
replace golang.org/x/oauth2 => github.com/golang/oauth2 latest
replace golang.org/x/time => github.com/golang/time latest
replace golang.org/x/image => github.com/golang/image latest
replace golang.org/x/mobile => github.com/golang/mobile latest
replace cloud.google.com/go => github.com/googleapis/google-cloud-go latest
replace google.golang.org/grpc => github.com/grpc/grpc-go latest
replace google.golang.org/appengine => github.com/golang/appengine latest
replace google.golang.org/genproto => github.com/googleapis/go-genproto latest
replace google.golang.org/api => github.com/googleapis/google-api-go-client latest

使用自己的私有包

问题1

cannot load xxx: cannot find module providing package xxx

解决方法:xxx是私有包,私有包如果不想发布到网上,需要手动添加require ,然后replace 进行替换,将私有包指向本地module所在的绝对或相对路径

一般用相对路径更通用。

手动修改go.mod 添加xxx的require和replace

require (
xxx v0.0.0
)
replace xxx v0.0.0 => ./xxx

再度运行go test 命令,发现仍有失败提示如下,找不到xxx文件夹下的go.mod文件。

问题2

go: parsing xxx\go.mod: open xxx\go.mod: The system cannot find the file specified.
go: error loading module requirements

解决方法:xxx库也需要使用Module管理,为私有包xxx也生成mod文件。运行如下命令:

cd xxx;
go mod init xxx

xxx文件夹下的go.mod文件如下:

module dbredis
go 1.12

okay~

---------------------------Go:simple is better. -------------------------------

golang包管理工具的更多相关文章

  1. Golang包管理工具glide简介

    Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...

  2. golang包管理工具及环境管理工具;如何下载外网的依赖包

    简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...

  3. Golang包管理工具之govendor的使用

    1. govendor简介 golang工程的依赖包经常使用go get命令来获取,例如:go get github.com/kardianos/govendor ,会将依赖包下载到GOPATH的路径 ...

  4. golang包管理工具glide安装

    1:下载安装glide go get github.com/Masterminds/glide glide的源码以及exe文件在第一个gopath目录,如果不知道哪个是第一个gopath,echo一下 ...

  5. 告别GOPATH,快速使用 go mod(Golang包管理工具)

    https://studygolang.com/articles/17508?fr=sidebar 文中的wserver为module名,route为本地的包名,go.mod所在的目录名不一定非要和m ...

  6. Golang学习--包管理工具glide

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  7. go包管理工具glide使用方法

    golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案. go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉 ...

  8. glide包管理工具

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  9. godep 包管理工具

    godep是解决包依赖的管理工具 安装 go get github.com/tools/godep 成功安装后,在GOPATH的bin目录下会有一个godep可执行的二进制文件,后面执行的命令都是用这 ...

随机推荐

  1. 25.Flutter中的表单 Radio RadioListTile Switch SwitchListTile 以及表单组件实现一个简单的学员登记系统(下)

    四.Radio.RadioListTile单选按钮组件 Radio常用属性: value单选的值. onChanged改变时触发. activeColor:选中的颜色.背景颜色 groupValue: ...

  2. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_01-我的课程-需求分析与PageHelper技术

    1 我的课程 1.1需求分析 课程添加完成后可通过我的课程进入课程修改页面,此页面显示我的课程列表,如下图所示,可分页查询. 注意:由于课程图片服务器没有搭建,这里在测试时图片暂时无法显示. 上边的查 ...

  3. PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  4. Js 实现局部打印功能

    1.当前页面 var bodyHtml = window.document.body.innerHTML; window.document.body.innerHTML = printHtml;//p ...

  5. Java中使用队列Queue

    示例代码: Queue<Integer> queue = new LinkedList<Integer>(); for (int i = 1; i <= 100; i + ...

  6. 2019强网杯部分misc&web

    0x01 前言 前两天菜鸡+x和几个大哥算是正式参加了一次ctf的线上赛,也是第一次参加这种比赛(前一段时间巨佬也给了我们一个西班牙的比赛,不过不算是正式参赛,做题的时候,比赛已经结束了),没想到出师 ...

  7. opencv入门笔记

    一.图片基本操作 1.1 显示图片 #include <opencv2/opencv.hpp> //头文件 using namespace cv; //包含cv命名空间 void main ...

  8. 最新 蚂蚁金服java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.蚂蚁金服等10家互联网公司的校招Offer,因为某些自身原因最终选择了蚂蚁金服.6.7月主要是做系统复习.项目复盘.Leet ...

  9. GB和GIB的区别

    天啦撸,这么多年才知道这个东西! Gibibyte(giga binary byte)是信息或计算机硬盘存储的一个单位,简称GiB.由来“GiB”,“KiB”,“MiB”等是于1999年由国际电工协会 ...

  10. 【基本优化实践】【1.6】在sql server修改且移动数据库文件位置

    在master数据库中,SQL Server提供系统扩展的存储过程,其中有一些存储过程的命名以xp_开头,用于处理操作系统的文件. 一,判断文件是否存在 存储过程sys.xp_fileexist 用于 ...