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中安装包的方式有很多种: ...
随机推荐
- 让pomelo可以获取到反向代理websockets的真实用户IP
/node_modules/pomelo/lib/connectors/hybridsocket.js 找到 var Socket = function(id, socket) { 给remoteAd ...
- 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图
数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...
- 在Jetson TX2上安装caffe和PyCaffe
caffe是Nvidia TensorRT最支持的深度学习框架,因此在Jetson TX2上安装caffe很有必要.顺便说一句,下面的安装是支持python3的. 先决条件 在Jetson TX2上完 ...
- CF1316E Team Building
CF1316E [Team Building] 状压dp,感觉比D简单 \(f[i][s]\),表示考虑前\(i\)个人,状态为\(s\)(\(s\)的第\(j-1\)个二进制位表示队员的第\(j\) ...
- Linux安装maven(详细教程)
一.简介 Maven是意第绪语,意思是“知识的积累者”,最初是为了简化Jakarta Turbine项目中的构建过程.有几个项目,每个项目都有自己的Ant构建文件,所有项目都略有不同.JAR已检入CV ...
- P1750 出栈序列
这好像是普及难度的吧~ 感觉再次被小学生吊打了........ \(\color{Red}{----------------------=|(●'◡'●)|=我是手动的分割线------------- ...
- M - Little Pony and Harmony Chest 状压dp
M - Little Pony and Harmony Chest 怎么感觉自己越来越傻了,都知道状态的定义了还没有推出转移方程. 首先这个a的范围是0~30 这里可以推出 b数组的范围 0~60 ...
- Markdown更改字体、颜色、大小,设置文字背景色,调整图片大小设置居中,插入表格等方法
Markdown 通过简单标记语法,使普通文本内容具有一定格式.但它本身不支持修改字体.字号与颜色等功能的. 一.更改字体大小.颜色.更改字体 Markdown语法 <font face=&qu ...
- jQuery的事件绑定与触发 - 学习笔记
jQuery的事件绑定与触发 事件绑定 自动触发事件 常用的鼠标事件 事件冒泡和默认行为 事件冒泡 默认行为 获得当前鼠标的位置和按键 jQuery的事件绑定与触发 事件绑定 基本绑定 $(eleme ...
- leetcode-4. 寻找两个正序数组的中位数
leetcode-4. 寻找两个正序数组的中位数. 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2. 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(l ...