问题 | golang开发之go.mod的使用方法
文章目录
- go mod之坑
- 背景
- 项目
- mod实战
- 主程序调用同目录里面的包
- 主程序调用其他目录的包
- 重要提醒
- 问答FAQs
- 1. 有些包由于特定网络原因无法访问怎么办?
- 2. 公司通过 gitlab 搭建了私有库,二方依赖库下载不下来怎么办?
- 3. 依赖包怎么更新指定版本?
- 4. 某些依赖包的地址变更导致无法找到了怎么办?
- 5. 版本冲突怎么办?
- 6. 本地包如何引用?
- go mod 里还有一些其他功能,也在此列举,方便大家查阅:
go mod之坑
背景
这是二次修改,原因是,我隔了一段时间没有编程,现在有需要再重新执笔,下载了一个第三方的开源项目,结果原作者是在gopath里面开发的,那么到了21世纪的今日,go都版本都去到15了。我怎么不能用mod去管理版本呢。而且重要的一点,开发一定要在gopath里面进行开发,这个超级不方便的嘛。
结果蒙蔽了,我不懂了,重新看回这边当初写过的文章。什么鬼。屎一般的存在。
go的版本为:go version go1.14.4 windows/amd64
编码工具为vscode
goproxy在国内有三个可用的
https://goproxy.io
https://goproxy.cn
https://mirrors.aliyun.com/goproxy/
项目
随便找个go开发的开源项目,如果你不想找,看如下链接:
https://github.com/Adminisme/ServerScan
整个打包下载回来即可。
自己开发的程序目录架构,也是可以的,主要A目录里面包含B目录,B目录里面包含C目录。
A是主程序,B是模块,C是B的模块。
简单理解:A是爷爷,B是爸爸,C是儿子。
特别注意的是:
一个项目只需要有一个mod即可
mod实战
一个项目只需要使用一个mod即可
上面这句话真的很重要。
主程序调用同目录里面的包
1、当你按照我刚刚提供的一个开源项目,下载回来解压后,项目是这样的:
PS:这里需要解释一下,ServerScan这个开源的项目里面,包含了三个独立功能的项目。要知道,go的话一个项目只认一个main文件。所以每个独立功能项目里面作者可能基于什么原因又弄了两个版本。我们进入了其中一个项目里面,轻便版扫描。
2、我们进入到子模块文件夹。
PS:在vscan子模块文件夹里面还有子模块。一环套一环。
3、了解完整个项目结构之后,真正需要使用go mod版本来进行管理了。这里我们要在主程序的目录下,使用命令初始化go mod管理。
命令是:go mod init
4、这里我们需要记住的是,当前程序我们已经通过init成立了一个包,包的名字是:scanAir,也就是说,这个主程序里面包含的所有模块都会由这个包scanAir来控制并管理。
5、实际上我们init后,是不需要去打开和管理这个mod文件的。我们在主程序中,添加一下B模块(爸爸)。
上图是原作者,导入自己开发的子模块方法。
下面是我们用了go mod后导入自己开发的模块(包)方法。
PS:这里只是主程序调用第二层的子模块,像上面我们了解到的,B模块,它自身也需要再调用C模块,那这里的话,应该按照主程序调用B模块的讨论继续往下写即可,如:A包名/B模块名称/C模块名称。
主程序调用其他目录的包
1、主程序在C盘,想调用D盘的子包;情况就是,主程序需要mod文件,D盘的子包也需要mod文件。
2、打开主程序的mod文件,进行修改。
主要修改使用到的两个关键字:require
、replace
require icmpcheck v0.0.0
replace icmpcheck => D:\code\icmpcheck
3、直接导入包即可。
重要提醒
使用开源的项目,要注意原作者使用的第三方库,我们需要人工或者配置好go mod 之后下载这些库才行。
库是包含了很多个包的。
一个项目里面,称为一个库,库里面可以设计成很多个模块(包)。
问答FAQs
1. 有些包由于特定网络原因无法访问怎么办?
Go module 加入了代理的机制,只要设置一个代理地址,就可以提供代理访问。阿里云就提供了这样一个go 的代理,是完全免费的服务。公共代理仓库会代理并缓存go模块,你可以利用该代理来避免 DNS 污染或其他问题导致的模块拉取缓慢或失败的问题,加速你的项目构建。
设置的方式非常简单,只需要设置如下环境变量即可,执行命令:
linux下:export GOPROXY=https://mirrors.aliyun.com/goproxy/
windows下:set GOPROXY=https://mirrors.aliyun.com/goproxy/
go1.13 加入了 mirror 机制,可以通过 go env -w 设置 mirror,其实就是之前的 GOPROXY 做的更到位一些,执行命令:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
经过测试,要goproxy的地址存在才行,如果你的goproxy是xxx.com,这里又写了aaa.cn,会提示覆盖错误的。
逗号后面可以增加多个 proxy,最后的 direct 则是在所有 proxy 都找不到的时候,直接访问,代理访问不到的私有仓库就可以正常使用了。
这个功能基本上是在家远程办公的必备工具了。
2. 公司通过 gitlab 搭建了私有库,二方依赖库下载不下来怎么办?
这个几乎是最常见的问题,比较简单的解决方案是 hack 一下 git 配置:
git config --global url."git@gitlab.your-company.com:<your>/<package>.git".insteadOf "https://gitlab.your-company.com/<your>/<package>.git"
这个方案依赖你本地的~/.ssh/id_rsa
, 这样你就可以正常 go get
了。
3. 依赖包怎么更新指定版本?
先查看版本:
$ go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
再更新:
$ go get rsc.io/sampler@v1.3.1
go: finding rsc.io/sampler v1.3.1
go: downloading rsc.io/sampler v1.3.1
go: extracting rsc.io/sampler v1.3.1
$ go test
PASS
ok example.com/hello 0.022s
4. 某些依赖包的地址变更导致无法找到了怎么办?
go 的依赖与项目名直接相关,这就导致如果我们使用了 github 上的项目,然后项目的维护人员突发奇想改个项目名称,就会导致所有依赖它的项目都无法找到依赖。
还好有 replace 的机制:
replace golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
5. 版本冲突怎么办?
这就要梳理版本了,是最没有捷径的。一个比较简单的办法是把所有 go.mod 里不需要指定版本的包全部删掉,仅指定必要的包版本,然后通过 go build 让项目自动构建依赖包的版本。
通过 go mod graph 可以查看具体依赖路径:
$ go mod graph
github.com/oam-dev/oam-go-sdk github.com/go-logr/logr@v0.1.0
github.com/oam-dev/oam-go-sdk github.com/onsi/ginkgo@v1.10.1
github.com/oam-dev/oam-go-sdk github.com/onsi/gomega@v1.7.0
github.com/oam-dev/oam-go-sdk github.com/stretchr/testify@v1.4.0
github.com/oam-dev/oam-go-sdk golang.org/x/net@v0.0.0-20191004110552-13f9640d40b9
github.com/oam-dev/oam-go-sdk k8s.io/api@v0.17.0
github.com/oam-dev/oam-go-sdk k8s.io/apimachinery@v0.17.0
github.com/oam-dev/oam-go-sdk k8s.io/client-go@v0.17.0
github.com/oam-dev/oam-go-sdk sigs.k8s.io/controller-runtime@v0.4.0
...
左边是项目包,右边是被依赖的包和版本。
如果确实存在两个需要指定版本的包互相冲突,那就要做取舍,修改代码,升级或降级某个包了。
6. 本地包如何引用?
如果在代码调试过程中,涉及到修改其他依赖项目代码,这时候就要引用本地包,也可以采用 replace 机制:
require (golang.org/x/crypto v0.0.0
)
replace golang.org/x/crypto v0.0.0 => ../crypto
...
后面这个就是个相对项目路径的本地依赖所在路径。
解决了上面的这些问题,基本上你就可以愉快的使用 module 功能啦。
go mod 里还有一些其他功能,也在此列举,方便大家查阅:
go mod 子命令 | 功能 |
---|---|
download | download modules to local cache(下载依赖包) |
edit | edit go.mod from tools or scripts(编辑 go.mod) |
graph | print module requirement graph(打印模块依赖图) |
init | initialize new module in current directory(在当前目录初始化mod) |
tidy | add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
vendor | make vendored copy of dependencies(将依赖复制到vendor下) |
verify | verify dependencies have expected content(验证依赖是否正确) |
why | explain why packages or modules are needed(解释为什么需要依赖) |
问题 | golang开发之go.mod的使用方法相关推荐
- android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例
Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...
- android 接口实现方法,Android应用开发之Android 请求网络接口实现方法
本文将带你了解Android应用开发之Android 请求网络接口实现方法,希望本文对大家学Android有所帮助. public class Fragment01 extends Fragmen ...
- mipcms模板开发之block(块)内容调用方法
文章目录[隐藏] 块内容调用前言 块内容调用图片描述 块内容调用教程 块内容调用前言 最近几天在筹划资源网站,网站采用MIPCMS内容管理系统,前端采用 bootstrap4 写了一套模板. 在模板编 ...
- Golang 开发之Cobra初探
一 背景 在云原生如日中天的当下,相信很多人对Kubernetes/etcd等都有所听闻,当我们看其源码或对其进行二次开发的时候,可以发现其均使用了一个命令行程序库Cobra,其是一个用来编写命令行的 ...
- (0069)iOS开发之dequeueReusableCellWithIdentifier的两个方法的区别
参考:http://www.jianshu.com/p/ce0cdb1bf20b :http://blog.csdn.net/mandmg/article/details/52456862 if (f ...
- python模拟布朗运动_python开发之thread实现布朗运动的方法
# Brownian motion -- an example of a multi-threaded Tkinter program.from tkinter import *import rand ...
- Android开发之LayoutInflater.from(context).inflate()方法参数介绍解决RecyclerView加载布局不全的问题
咱们先看下item的xml布局高度为64dp <?xml version="1.0" encoding="utf-8"?> <Relative ...
- android开发之bitmap转数组的方法
/** 方法一* 将bitmap转为数组的方法** @param bitmap 图片* @return 返回数组*/public byte[] getBytesByBitmap(Bitmap bitm ...
- Android开发之shape画圆环的方法
方法一: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" ...
最新文章
- Python中线程Timeout的使用
- Spark学习之路(二)
- 最详细易懂的CRC-16校验原理(附源程序)
- That assembly does not allow partially trusted callers.
- 打印页面横向怎么设置_条码打印软件标签纸页面设置的方法
- ubuntu系统配置nijia_在Debian系统中使用backupninja定制备份计划的教程
- 通过脚本启动批量服务
- 需求、需求工程与需求工程师 — 2.需求的来源
- SIP - FreeSwitch 安装 编译
- idea 插件开发教程
- 用WPF做报表控件(一)
- Hadoop | 初学基础原理
- 海外国外支付渠道接口对接
- 什么叫黑名单?黑名单还能贷款吗?
- 攻城掠地服务器维护到几点,攻城掠地玩法全解秘
- 【数据库基础】01_数据库概述与MySQL语法基础
- 回归方程带常数项matlab,请教regress命令求解不带常数项的多元线性回归方程的问题...
- 几十万换来的Ddos攻击防护经验分享(转载)
- 五十四、HBase的协处理器
- vmware 桥接不能联网问题
热门文章
- Python可以这样学(第九季 机器学习案例与实战)-董付国-专题视频课程
- 基于队列的迷宫求解实现
- 打砖块游戏c语言设计,打砖块游戏的源代码(请多指教)
- ICT学习笔记(3)IP编址
- c# getresponsestream返回byte[]_C#通过SharpZipLib库创建压缩文件
- zynq+linux固化程序,MiZ702学习笔记6——ZYNQ如何固化程序
- c语言聊天程序代码,今天打的代码。基于TCP的聊天程序。
- java 不同类数据的传递_java 数据在不同类之间的传递
- android connect 闪退,Connect闪退
- Android可滑动画板,Android 利用 Canvas 画画板