Go 包管理中的常见问题
随处可见的 GO111MODULE=on
在 GitHub 上,经常看到不少项目的 readme 里都有这么一句:
✗ GO111MODULE=on go get golang.org/x/tools/gopls@latest
2009 年,Go 被官方发布的时候,没有自带包管理功能。go get 命令会根据 import 路径,把所有源码下载到$GOPATH/src目录下。这导致,我们无法对依赖包进行版本控制,只有master分支能代表一个包的稳定版本。
Go 1.11 版本中,引入了 Go Modules (即,Go 模块),可以通过 go.mod 文件存储依赖包的版本号。
从那时起,GOPATH模式和Go模块模式之间的交互就成为了Go最大的陷阱之一。
要想避开这些陷阱,离不开一个环境变量——GO111MODULE。
GO111MODULE=on 是干嘛用的
简单来讲,GO111MODULE=on会开启 Go 模块模式,允许用户在 go get 时指定依赖包的版本。
✗ GO111MODULE=off go get golang.org/x/tools/gopls@v0.1.8
go: cannot use path@version syntax in GOPATH mode
# 报错:GOPATH模式无法指定版本
使用 go get 时,go.mod 会自动更新
这里要小心踩坑。默认情况下,如果当前目录下有 go.mod 文件,go get 命令会把你刚刚安装的依赖包更新到 go.mod。
在 安装一些开发工具(比如gopls, kind)时,如果你不想更新 go.mod 文件,可以使用cd && go get命令避免污染 go.mod 。
go get VS go install
- go get: 解析、添加 pkg 之间的依赖关系,然后下载、编译、安装pkg。【默认修改go.mod】
- go install: 编译、安装 代码中import的pkg。【不修改go.mod】
# 更详细的解释,可见官方文档
✗ go help get
✗ go help install
不要在 go get 中混用 -u 和 @version
比如 在使用@latest时,你只想要更新当前包到最新tag。加上-u选项后,go会把这个包的所有依赖包也更新。如果依赖包里有breaking changes,那就坑惨了。
# 只更新 protos-go
✗ go get git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6
# 依赖包也全都更新
✗ go get -u git.bala.com/hahaha/protos-go@latest
go: git.bala.com/hahaha/protos-go latest => v0.0.6
go: github.com/golang/protobuf upgrade => v1.4.2
go: google.golang.org/protobuf upgrade => v1.23.0
再比如,如果使用@v0.1加上-u选项,go get会获取1.0标签下最新的版本。
如何修改依赖包内的代码
有时候,我们import了一个依赖包,但是需要修改其中的代码,怎么办呢?
- 1)最简单的方法: 在 go.mod 文件最后加上
replace。
# 替换成本地路径
replace github.com/maelvls/beers => ../beers
# 替换成 github 路径
replace github.com/facebookincubator/ent v0.0.1 => github.com/mine/ent v0.0.1
- 2)使用vendor
使用 go mod vendor + go build -mod=vendor命令,这会强制 go 使用 vendor/ 目录下的文件,而不是$GOPATH/pkg/mod下的。
这俩命令,也可以帮助你的 vim 和 VSCode 解决找不到 某个指定版本的包的问题,毕竟现在所有的依赖包都在 /vendor 目录下了。
如何使用私有库的 pkg
大家在公司一般使用 Gitlab/Github 上的私有代码库。Go 1.13之后,使用GOPRIVATE变量,我们可以跳过包代理,更快捷地获取私有库代码。
# 也可以在 .gitconfig 文件中加上相应配置
git config --global url."https://foo:${GITHUB_TOKEN}@github.com/company".insteadOf "https://github.com/company"
export GOPRIVATE=github.com/company/\*
参考链接:
Go 包管理中的常见问题的更多相关文章
- 在python包管理中使用easy_install软件的步骤
本文主要介绍的是让python包管理变得更加容易的实际应用方法,就是运用easy_install这一软件,下面是文章的具体介绍. easy_install让python包管理变得 如果你想对Pytho ...
- CentOS配置本地光盘yum源
在实际使用linux的过程中,会经常出现安装的发行版有的软件包没有安装的情况,这时,就需要用户从如下两种操作中做出选择:1.手动安装rpm包.2.用yum命令安装软件包. 选择1手动安装的时候经常会遇 ...
- Windows中一个22年的漏洞
X Windows系统,今天作为世界各地的Linux桌面,已经存在超过20年了,仍然存在Bug.几天前Sysadmins为libXfont库提供了补丁,来对应新发现的已经在代码中存在了22年的特权升 ...
- WebRTC for UWP
首先还是简单的介绍下webRTC吧: WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2 ...
- NET笔记——IOC详解和Unity基础使用介绍
说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己. IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转 ...
- php composer包管理工具
一 . 包管理工具 你在Centos上装工具的时候直接yum -y install xx 比你去rpm -ivh xx.rpm 是不是爽很多呢? composer 就是安装php 代码的一个类似工具. ...
- Windows 多用户远程访问 Ubuntu 14.04桌面
使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...
- C#中四步轻松使用log4net记录本地日志
在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...
- python打包工具distutils、setuptools分析
在上一篇博文中总结了python中导入包,安装包一条完整的线路.其中有一个有意思的知识点,安装包的方式有很多种,模块和包管理中打包,发布,安装也是值得研究的内容. python中安装包的方式有很多种: ...
随机推荐
- JS省城级联
2019独角兽企业重金招聘Python工程师标准>>> 这里是HTML内容 <label class="control-label col-md-2 col-sm-3 ...
- Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法
使用文本配置文件的配置方式结合bind的最新的acl和view特性来实现智能DNS想必很多人已经很熟悉了,使用MySQL数据库来存放zone文件的方式可能也不少.对于两者都熟悉的,实现 Bind+DL ...
- 写给MongoDB开发者的50条建议Tip21
本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
这个题额,我觉的是一道水题,思维题,需要考虑的情况比较多,题意一个机器人给一条指令,循环n遍,问此过程中离原点最远距离. 考虑最远距离可能出现的的情况. 每次循环之后距离至少为0: 1.假设他每一次循 ...
- python(If 判断)
一.if判断 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 注意: 代码的缩进为一个 tab 键,或者 4 个空格 在 Python 开发中,Tab 和空格不要 ...
- 自动化运维工具Ansible之Tests测验详解
Ansible Tests 详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...
- Re模块练习题
import re s = "1 -2*(60+(-40.35/5)-(-4*3))" # 获取所有数字 ret = re.findall(r"\d+", s) ...
- CC2530应用——按键控制灯光状态变化
独立新建工程并编写.编译代码,实现按键控制灯光闪烁状态的变换,实现以下任务要求:[1]程序开始运行:D4灯闪烁,D3.D5.D6灯熄灭.[2]按下模块上的SW1按键松开后,实现D5.D6灯轮流闪烁.[ ...
- struts2入门教学
我的博客地址:https://blog.csdn.net/qq_41907991 首先介绍一下struts2使用的基本步骤: 1.导入相关的 jar 文件 2.需要在 web.xml 文件中配置一个 ...
- 一篇文章彻底理解Redis持久化:RDB和AOF
为什么需要持久化? Redis对数据的操作都是基于内存的,当遇到了进程退出.服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复.有了持久化机制,Redis在下次重启时可以 ...