随处可见的 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 包管理中的常见问题的更多相关文章

  1. 在python包管理中使用easy_install软件的步骤

    本文主要介绍的是让python包管理变得更加容易的实际应用方法,就是运用easy_install这一软件,下面是文章的具体介绍. easy_install让python包管理变得 如果你想对Pytho ...

  2. CentOS配置本地光盘yum源

    在实际使用linux的过程中,会经常出现安装的发行版有的软件包没有安装的情况,这时,就需要用户从如下两种操作中做出选择:1.手动安装rpm包.2.用yum命令安装软件包. 选择1手动安装的时候经常会遇 ...

  3. Windows中一个22年的漏洞

     X Windows系统,今天作为世界各地的Linux桌面,已经存在超过20年了,仍然存在Bug.几天前Sysadmins为libXfont库提供了补丁,来对应新发现的已经在代码中存在了22年的特权升 ...

  4. WebRTC for UWP

    首先还是简单的介绍下webRTC吧: WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2 ...

  5. NET笔记——IOC详解和Unity基础使用介绍

    说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己. IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转 ...

  6. php composer包管理工具

    一 . 包管理工具 你在Centos上装工具的时候直接yum -y install xx 比你去rpm -ivh xx.rpm 是不是爽很多呢? composer 就是安装php 代码的一个类似工具. ...

  7. Windows 多用户远程访问 Ubuntu 14.04桌面

    使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...

  8. C#中四步轻松使用log4net记录本地日志

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  9. python打包工具distutils、setuptools分析

    在上一篇博文中总结了python中导入包,安装包一条完整的线路.其中有一个有意思的知识点,安装包的方式有很多种,模块和包管理中打包,发布,安装也是值得研究的内容. python中安装包的方式有很多种: ...

随机推荐

  1. Leetcode 1. 两数之和 (Python版)

    有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...

  2. Jmeter 结构体系及运行顺序

    一.Jmeter 运行原理: Jmeter 时以线程的方式来运行的(由于Jmeter 是 java 开发的所以是运行在 JVM 虚拟机上的,java 也是支持多线程的) 二.Jmeter 结构体系 1 ...

  3. 手写实现java栈结构,并实现简易的计算器(基于后缀算法)

    一.定义 栈是一种线性表结构,栈结构中有两端,对栈的操作都是对栈的一端进行操作的,那么被操作的一端称为栈顶,另一端则为栈底.对栈的操作其实就是只有两种,分别是入栈(也称为压栈)和出栈(也称为弹栈).入 ...

  4. python字符串分段组合(更新)

    描述 获得输入的一个字符串s,以字符减号(-)分割s,将其中首尾两段用加号(+)组合后输出.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬ ...

  5. 初识CoAP协议

    前言 本文介绍什么是CoAP,以及如何在物联网设备上使用它.CoAP是一种物联网协议,具有一些专门为受约束的设备而设计的有趣功能.还有其他一些可用于构建物联网解决方案的IoT协议,例如MQTT等. 物 ...

  6. Web概念

    目录 Web概念概述 Web概念概述 JavaWeb 使用 Java 语言开发基于互联网的项目 软件架构 C / S:Client / Server 客户端 / 服务器端 在用户本地有一个客户端程序, ...

  7. 【FPGA篇章七】FPGA系统任务:详述常用的一些系统函数以及使用方法

    欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 系统任务和系统函数是Verilog标准的一部分,都以字符"$"为开头.系统任务可划分为六类,下面分别给出一些常用任务的用 ...

  8. Java的Object.wait(long)在等待时间过去后会继续往后执行吗

    Java的Object.wait(long)在等待时间过去后会继续往后执行吗 Object.wait(long)方法相比于wait,多了个等待时长,那么当等待时长过去后,线程会继续往下执行吗? 单个线 ...

  9. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...

  10. Code Review 常见的5个错误模式

    原作者:Trisha Gee Code Review 的时候,每个人都会关心最佳实践,但最坏的实践有时可能会更有启示意义. Code Review是研发团队必不可少的,但并不总是正确的.这篇文章指出了 ...